【问题标题】:Vue and Bootstrap Vue - dynamically use slotsVue 和 Bootstrap Vue - 动态使用插槽
【发布时间】:2020-01-28 03:38:22
【问题描述】:

我正在尝试在 bootstrap-vue 表中创建一个插槽,以使用自定义组件呈现任何布尔值。

所以我有一个简单的表

<b-table :items="items" :fields="columns" >

</b-table>

现在,如果我想以特定方式呈现单个列,我必须使用插槽

<template v-slot:cell(active)="data" >
    <my-component :item="data.item" />
</template>

它有效,因为我知道 active 是一个布尔值。

我想概括这种行为,但我不能在模板中使用 v-for 并且不能使用 v-slot:cell(active) 如果不在模板上...想法是创建一个包含所有布尔字段的数组并对其进行迭代...但它不起作用..

类似的东西

<template v-slot:cell(b)="data" v-for="b in booleanFields">
    <my-component :item="data.item[b]" />
</template>

【问题讨论】:

    标签: vue.js bootstrap-vue


    【解决方案1】:

    由于 Vue 支持Dynamic Slot Names,因此您可以使用变量来使用v-bind:[attributeName]="value" 语法设置插槽名称。

    这样你可以做这样的事情:

    <template v-slot:['cell(' + b + ')']="data" v-for="b in booleanFields">
    

    但由于dynamic argument expression constraints,因此无法使用引号。因此,您必须创建一个辅助方法来执行该连接。所以:

    <template v-slot:[gomycell(b)]="data" v-for="b in booleanFields">
    

    methods: {
      gomycell(key) {
        return `cell(${key})`; // simple string interpolation
      }
    

    当然,您可以将方法 gomycell 命名为 cell 并像 v-slot:[cell(b)]="data" 一样使用它(注意 []s),但我留下了名称 gomycell,这样在这个例子中就更清楚了方法的名称是什么,什么不是。


    演示:

    这是一个展示 dynamic slot names 用法的小演示,它不是 b-table,但我认为它足以证明它是可能的:

    Vue.component('my-table', {
      template: '#my-table',
    })
    
    new Vue({
      el: '#app',
      data: {
        booleanFields: [true, false]
      },
      methods: {
        gomycell(key) {
          return `cell(${key})`;
        }
      }
    })
    <script src="https://unpkg.com/vue"></script>
    
    <div id="app">
      <my-table>
        <template v-slot:[gomycell(b)]="data" v-for="b in booleanFields">
          <h3>who? {{ data.is }}</h3>
        </template>
      </my-table>
    </div>
    
    <template id="my-table">
      <div>
        <div style="color:green"><slot name="cell(true)" v-bind="{is: 'true!'}"></slot></div>
        <div style="color:red"><slot name="cell(false)" v-bind="{is: 'false!'}"></slot></div>
      </div>
    </template>

    【讨论】:

    • 你也可以使用字符串插值(当使用单文件组件时,它与 DOM 模板没有相同的限制):&lt;template v-slot:[cell(${b})]="data" v-for="b in booleanFields"&gt; 注意属性名称中不能有空格(= 之前的任何内容)。这也可以:&lt;template v-slot:['cell('+b+')']="data" v-for="b in booleanFields"&gt;(注意表达式中缺少空格)
    • 感谢@acdcjunior 这种动态插槽名称功能完美!
    • 请注意,Troy 的示例有效,但反引号未正确显示在评论中。这可能会有所帮助:&lt;template v-slot:[`cell(${b})`]="data" v-for="b in booleanFields"&gt;
    • 这就是为什么我永远不会推荐模板而不是渲染函数的部分原因。你必须做出所有这些毫无意义的变通办法。如果你使用渲染函数,你只需要知道 javascript。老实说,这就是为什么我永远不会推荐 vue 而不是 react 的部分原因。社区是围绕无意义的模板系统构建的。
    • 你看,并不是所有的东西都这么干脆。许多人发现模板在一般情况下更容易推理,并且可以构建整个应用程序而无需使用插槽,更不用说动态插槽名称了。
    猜你喜欢
    • 2018-11-20
    • 2020-07-21
    • 2021-02-06
    • 2018-02-25
    • 1970-01-01
    • 2018-04-29
    • 2018-08-23
    • 2019-06-08
    • 2020-12-24
    相关资源
    最近更新 更多