如何用 Vuejs 将命名插槽从 parent 替换为 child 到 grandchild

how to substitute named slot from parent to child to grandchild with Vuejs

我面临着呈现第三方日期选择器并从第三方组件获取值的情况。因为它是第三方,所以我无法在其上定义道具。但是,第三方组件提供了在 v-model.

中传递变量的能力

所以我的组件设计要求我能够将命名插槽从 parent 传递到 child 再到 grandchild。

例如;

//============ 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>

我试过将指定的插槽传递到适当的位置,但无法正常工作。请帮助我解决这个问题。

很高兴它现在可以正常工作了。我所做的更改使其起作用

在 EnterTaskOrUploadByCSV 中,我添加了一个模板插槽来保存将从父级接收的日期选择器组件。那么孙子组件将期待名为 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>
`
});