Vue 和 Bootstrap Vue - 动态使用插槽

bes*_*art 7 vue.js bootstrap-vue

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

所以我有一个简单的表

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

</b-table>
Run Code Online (Sandbox Code Playgroud)

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

<template v-slot:cell(active)="data" >
    <my-component :item="data.item" />
</template>
Run Code Online (Sandbox Code Playgroud)

它有效,因为我知道这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>
Run Code Online (Sandbox Code Playgroud)

acd*_*ior 17

因为 Vue 支持动态插槽名称,您可以使用变量来使用v-bind:[attributeName]="value" 语法设置插槽名称。

通过这种方式,您可以执行以下操作:

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

但是由于动态参数表达式约束,无法使用引号。因此,您必须创建一个辅助方法来进行该连接。所以:

<template v-slot:[gomycell(b)]="data" v-for="b in booleanFields">
Run Code Online (Sandbox Code Playgroud)

methods: {
  gomycell(key) {
    return `cell(${key})`; // simple string interpolation
  }
Run Code Online (Sandbox Code Playgroud)

自然,您可以将方法命名为gomycellascell并像使用它一样v-slot:[cell(b)]="data"(注意[]s),但我保留了名称gomycell,以便在此 texample 中更清楚该方法的名称是什么,什么不是。


演示:

这是一个展示动态插槽名称用法的小演示,它不是,b-table但我认为它足以表明它是可能的:

Vue.component('my-table', {
  template: '#my-table',
})

new Vue({
  el: '#app',
  data: {
    booleanFields: [true, false]
  },
  methods: {
    gomycell(key) {
      return `cell(${key})`;
    }
  }
})
Run Code Online (Sandbox Code Playgroud)
<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>
Run Code Online (Sandbox Code Playgroud)

  • 请注意,特洛伊的示例有效,但反引号在注释中没有正确显示。这可能会有所帮助: ```&lt;template v-slot:[`cell(${b})`]="data" v-for="booleanFields"&gt;``` (4认同)