Vue - 将插槽传递给子组件[重复]

Posted

技术标签:

【中文标题】Vue - 将插槽传递给子组件[重复]【英文标题】:Vue - pass down slots to child components [duplicate] 【发布时间】:2020-04-23 20:02:29 【问题描述】:

我想从 Vuetify 制作一个可重用的数据表组件。某些列可能包含 v-slot 以修改该列内的数据。例如:我将用户角色存储为整数,并希望它们显示为user 或 adminin the table. Currently I do this with thisv-slot`:

 <template v-slot:item.role="item ">
     (item.role === 1) ? 'Administrator' : 'User' 
 </template>

因为这不是每个数据表的用例,我想从使用数据表的父组件传递这些v-slot。我的数据表组件目前如下所示:

<template>
  <v-data-table :headers="headers" :items="items">
    <template v-slot:item.role="item ">
       (item.role === 1) ? 'Administrator' : 'User' 
    </template>
    <template v-slot:item.action=" item ">
      <v-icon @click="deleteItem(item)" small>fas fa-trash</v-icon>
    </template>
  </v-data-table>
</template>

<script>
export default 
  name: "DataTable",
  props: 
    title: String,
    headers: Array,
    items: Array
  ,
  methods: 
    deleteItem(item) 
      this.$emit("clicked", item);
    
  
;
</script>

这是我使用 DataTable 的组件(UserTable.vue):

<template>
  <DataTable :title="title" :headers="headers" :items="items" @clicked="onDelete" />
</template>

<script>
import DataTable from "../../../components/DataTable";
import axios from "axios";

export default 
  name: "UserTable",
  components: 
    DataTable
  ,
  props: 
    items: Array
  ,
  data: () => (
    title: "Users",
    headers: [
      
        text: "Name",
        value: "name"
      ,
      
        text: "Email",
        value: "email"
      ,
      
        text: "Role",
        value: "role"
      ,
       text: "Actions", value: "action", sortable: false 
    ],
  ),
  methods: 
    onDelete(item) 
      this.$emit("clicked", item);
    
  
;
</script> 

在理想情况下,我希望在 UserTable 组件中包含这样的内容:

<template>
  <DataTable :title="title" :headers="headers" :items="items" @clicked="onDelete">
      <template v-slot:item.role="item ">
       (item.role === 1) ? 'Administrator' : 'User' 
    </template>
    <template v-slot:item.action=" item ">
      <v-icon @click="deleteItem(item)" small>fas fa-trash</v-icon>
    </template>
  </DataTable>
</template>

然后像这样保持 DataTable 干净简单:

<template>
  <v-data-table :headers="headers" :items="items">
    <slot></slot>
  </v-data-table>
</template>

但这显然不像我预期的那样工作,因为它现在没有在所需的列中显示任何内容。我创建了一个 CodeSandBox,让你看看我现在拥有它:

https://codesandbox.io/s/priceless-bohr-oxu18?fontsize=14&hidenavigation=1&theme=dark

谁能告诉我为什么我的方法行不通,或者我该如何解决这个问题?

【问题讨论】:

这能回答你的问题吗? vue - how to pass down slots inside wrapper component? 【参考方案1】:

我通过查看这个答案设法解决了这个问题: https://***.com/a/52823029/7603806

<template v-for="slot in Object.keys($scopedSlots)" :slot="slot" slot-scope="scope"><slot :name="slot" v-bind="scope"/></template>

我在DataTable 组件中添加了上面的代码,现在从使用DataTableUserTable 组件传递插槽。

【讨论】:

以上是关于Vue - 将插槽传递给子组件[重复]的主要内容,如果未能解决你的问题,请参考以下文章

结合项目带你了解,Vue组件重复利用,及父组件传递数据给子组件

Vue 作用域插槽slot

Vue 作用域插槽slot-scope

Vue组件传值及插槽

Vue组件传值及插槽

Vue组件传值及插槽