как заменить именованный слот с родителя на ребенка на внука с помощью Vuejs - PullRequest
0 голосов
/ 05 июня 2018

Я столкнулся с ситуацией, когда нужно визуализировать сторонний инструмент выбора даты, а также получить значение от стороннего компонента.так как это третья сторона, я не могу определить опору для нее.Однако сторонний компонент предоставляет возможность передавать переменную в v-модели.

Таким образом, для разработки моих компонентов требуется, чтобы я мог передавать именованный слот от родителя к потомку внуку.

например;

//============ enter-or-upload-task.js =============

Vue.config.productionTip = false;

const sourceoftruth = {orderdate:''};

Vue.component('upload-by-csv',{
    template:
    `<div><input type="file" /></div>
    `
});

//here i want to use the date picker

Vue.component('enter-task-by-form',{
    data:function(){
       return {
          sourceoftruth
       };
    },
    methods:{
       getOrderDate: function(){
          console.log(sourceoftruth.orderdate);
       }
    },
    template:
    `<div>
        <label>Order Date:</label>
        <!--Hoping to get datepicker component displayed here -->
        <slot name="picker"></slot>
        <input type="submit" @click.prevent = "getOrderDate()" />
     </div>
    `
});

const EnterTaskOrUploadByCSV = {
    template:
    `<div>
            <upload-by-csv></upload-by-csv>
            <enter-task-by-form>
               <!-- wish to pass this named slot to this component -->
               <slot name="picker"></slot>
            </enter-task-by-form>
    </div>
    `
 }

 new Vue({
   el:"#app",
   data:{
     sourceoftruth
   },
   components:{
      'datepicker':vuejsDatepicker,
      'enter-form-or-csv':EnterTaskOrUploadByCSV
   }
 })
 // ===========================================================

index.html:

 <script src="./js/lib/vue.js></script>
 <script src="./js/lib/vuejs-datepicker.js"></script>

 <div id="app">
      <enter-form-or-csv>
         <datepicker v-model="sourceoftruth.orderdate" slot="picker"> 
         </datepicker>
      </enter-form-or-csv>
 </div>

 <script src = "./js/components/enter-or-upload-task.js"></script>

Я попытался передать указанный слот в соответствующую позицию, но не смог заставить его работать.Пожалуйста, мне нужна помощь, как решить эту проблему.

1 Ответ

0 голосов
/ 05 июня 2018

Рад, что сейчас работает.Изменения, которые я сделал, чтобы он работал

в EnterTaskOrUploadByCSV, я добавил слот шаблона для хранения компонента datepicker, который будет получен от родителя.тогда компонент внука будет ожидать шаблон с именем slot.

const EnterTaskOrUploadByCSV = {
template:
`<div>
        <upload-by-csv></upload-by-csv>
        <enter-task-by-form>
           <template slot="passpicker">
               <slot name="picker"></slot>
           </template>
        </enter-task-by-form>
</div>
`
}

Компонент внука ожидает шаблон с именем slot.

Vue.component('enter-task-by-form',{
data:function(){
   return {
      sourceoftruth
   };
},
methods:{
   getOrderDate: function(){
      console.log(sourceoftruth.orderdate);
   }
},
template:
`<div>
    <label>Order Date:</label>
    <!-- Datepicker will show now -->
    <slot name="passpicker"></slot>
    <input type="submit" @click.prevent = "getOrderDate()" />
 </div>
`
});
...