VueJS - 将插槽和作用域插槽向下传递给子模板中的组件

Posted

技术标签:

【中文标题】VueJS - 将插槽和作用域插槽向下传递给子模板中的组件【英文标题】:VueJS - passing slots and scoped slots down to the component in child template 【发布时间】:2018-11-11 11:10:30 【问题描述】:

我正在尝试找出一种方法,如何将插槽/作用域插槽从父组件向下传递到子组件。让我解释一下……

我使用 bootstrap-vue b-table 组件创建了一个数据表组件。一个非常简化的代码是这样的:

DataTable.vue:

<template>
    <div>
        <page-selector/>
        <b-table></b-table>
        <pager/>
    </div>
</template>

我接受字段定义列表和 api 端点作为道具,将其传递给 b-table,一切正常。例如渲染数据表中所有用户的组件:

UsersTable.vue:

<template>
     <data-table :fields="fields" :url="url"/>
</template>

我面临的问题如下:

bootstrap-vue 组件 b-table 使用多个插槽。例如用于更改表格标题 (&lt;template slot="table-caption"&gt;This is a table caption.&lt;/template&gt;) 的槽,或用于格式化表格中的字段或允许 html 字符 (&lt;span slot="email" slot-scope="data" v-html="data.value"&gt;&lt;/span&gt;) 的作用域槽。

如何将槽和作用域槽从 UsersTable 组件传递到 DataTable 组件,以便它们可以作为 b-table 组件中的槽使用?感谢您的帮助。

【问题讨论】:

【参考方案1】:

也许我现在想的不是很清楚,但在我看来,您可以在 DataTable.vue 中添加相同的命名插槽:

<template>
    <div>
        <page-selector/>
        <b-table>
            <template slot="table-caption"><slot name="table-caption"></slot></template>
            ....
        </b-table>
        <pager/>
    </div>
</template>

【讨论】:

谢谢!当然,这起到了作用,现在对我来说看起来很明显,#facepalm。作用域插槽的类似方法是什么?问题是插槽名称是动态的,只有 UsersTable 知道,因为它包含来自 :fields 的特定字段的名称。 所以在搜索了一下之后,在我看来它可能并不那么容易。我可以在 DataTable 组件中访问 this.$scopedSlots,但找不到如何将其绑定到 b-table 的 scopedSlots 的方法。 看起来this PR 会是一个解决方案...

以上是关于VueJS - 将插槽和作用域插槽向下传递给子模板中的组件的主要内容,如果未能解决你的问题,请参考以下文章

Vue 作用域插槽slot

VueJS 插槽:为啥通过父插槽传入的子方法不起作用?

Vue 作用域插槽slot-scope

vue2.1.x 新增作用域插槽

Vue的作用域插槽

Vue组件传值及插槽