【问题标题】:Pass row templates to vue boostrap table from parent component using slots使用插槽将行模板从父组件传递到 vue 引导表
【发布时间】:2018-12-27 08:43:11
【问题描述】:

我有一个名为“List”的组件,其中包含一个 vue boostrap 表:

<template>
  <div>
    <b-table :items="items">
      <!--<template slot="createdAt" slot-scope="row"> usually vue boostrap table row templates live here-->
        <!--{{row.item.createdAt|dateFormatter}}-->
      <!--</template>-->
      <slot name="tableTemplates"></slot> <!-- but i want to pass the templates from my parent template -->
    </b-table>
  </div>
</template>

我正在从我的父组件“订单”传递表格项目。我还想将行模板传递给 vue boostrap b-table 组件。

不幸的是,我无法使用插槽使其工作(那将是模板中的模板)

<template>
  <div>
    <list :items="items">
      <template slot="tableTemplates">
        <!--templates inside templates do not work-->
        <template slot="id" slot-scope="row">
          <span v-b-tooltip.hover :title="row.item.id">{{row.item.id|uuidFormatter}}</span>
        </template>
        <template slot="createdAt" slot-scope="row">
          {{row.item.createdAt|dateFormatter}}
        </template>
        <template slot="customer" slot-scope="row">
          {{row.item.customer}}
        </template>
      </template>
    </list>
  </div>
</template>

【问题讨论】:

  • 您是否考虑过创建实际组件而不是仅使用templates?
  • 你也可以使用inline templates

标签: javascript vue.js bootstrap-vue


【解决方案1】:

您可以更改 IVO 的答案并让您的 List 组件通用。
这是一种可能的方法:

列表组件模板:

<template>
  <b-table striped hover :items="items">
    <template :slot="slot.field" slot-scope="row" v-for="slot in slots">
      <slot :name="slot.name" :tbl="row"></slot>
    </template>
  </b-table>
</template>

列出组件道具:

  props: {
    items: {
      type: Array
    },
    slots: {
      type: Array
    }
  },

然后,在任何父组件中(使用 List),您可以定义一个 templates 数据属性,其中包含要传递给 List 组件的模板指令数组。在示例中,我使用了一个对象数组来传递动态槽名称和表数据字段。

父组件templates数据属性:

  data() {
    return {
      ...
      templates: [
        {
          name: "templateName",
          field: "dataFieldName"
        },
        ...
      ]
    };
  },

父组件模板,列表用法:

  <list :items="items" :slots="templates">
    <template slot="customSlotName" slot-scope="data">
        // Custom template here...
    </template>
  </list>

这将使您的所有自定义模板逻辑都存在于父组件中,例如。 Order.vue,而不是 List.vue。

这是更新后的代码框: https://codesandbox.io/s/244p9rx10n

【讨论】:

    【解决方案2】:

    你试过这样吗?您从表的插槽中获取范围,然后在嵌套插槽中提供此范围:

    <template>
      <div>
        <b-table :items="items">
          <template slot-scope="row">
            <slot name="tableTemplates" :tbl-props="row"></slot>
          </template>
        </b-table>
      </div>
    </template>
    

    【讨论】:

    • 不幸的是,这对我不起作用。这是一个包含您建议的代码框:codesandbox.io/s/z2mw6j7l4x
    • 更新了代码codesandbox.io/s/m41zoz0q5p,因为你没有正确使用我的建议。
    • 我不想在我的“抽象”类 List.vue 组件中定义像“last_name”这样的插槽。我希望我的模型和我的模型特定模板(如“last_name”)存在于 Orders.vue
    • 如果您不定义它,您将无法访问插槽的范围 - 这意味着您无法访问祖父的孙子。
    猜你喜欢
    • 2017-08-19
    • 1970-01-01
    • 2018-09-14
    • 2021-11-27
    • 1970-01-01
    • 1970-01-01
    • 2018-08-19
    • 2018-11-04
    • 2020-04-23
    相关资源
    最近更新 更多