代码之家  ›  专栏  ›  技术社区  ›  nebulousGirl

Bootstrap Vue动态表模板

  •  1
  • nebulousGirl  · 技术社区  · 8 年前

    https://bootstrap-vue.js.org/docs/components/table

    我是VueJS的新手,不确定如何解决这个问题,这使得寻找解决方案更加复杂。

    我使用API端点返回JSON数据:

    {
       "options":{
          "filter":false
       },
       "fields":[
          {
             "key":"id",
             "label":"Id",
             "editLink":false,
             "display":true,
             "sortable":true,
             "class":"shrink"
          },
          {
             "key":"name",
             "label":"Name",
             "editLink":true,
             "display":true,
             "sortable":true
          }
       ],
       "data":[ ]
    }
    

    这是我的表格模板:

    <b-table striped hover bordered foot-clone class="table-sm"
       :items="users" :fields="displayedFields" :per-page="perPage" :current-page="currentPage" :filter="filter"
       @filtered="onFiltered"
       >
       <template v-for="(field, index) in fields">
          <template slot="{{field.key}}" slot-scope="row" v-if="field.editLink">
             <router-link :to="'/user/' + row.item.id" v-bind:key="index"></router-link>
          </template>
       </template>
       <template slot="status" slot-scope="row">
          <toggle-button :width="36" :height="18" v-model="row.status" :labels="false" :colors="{checked: '#00FF00', unchecked: '#FF0000', disabled: '#CCCCCC'}"/>
       </template>
    
    </b-table>
    

    第一个模板标记是一个猜测。我希望能够有条件地从字段配置中为列选择一个表。您可以在我的尝试中看到,当字段的config editLink为true时,我希望放置一个RouterLink。

    1 回复  |  直到 8 年前
        1
  •  7
  •   nardnob    8 年前

    下面是一个jsfiddle,它显示了带有b表的动态列: https://jsfiddle.net/nardnob/wvk6fxgt/

    new Vue({
    	el: "#app",
    	data: {
       fields: [{
         key: "id",
         label: "Id",
         colType: "span"
       }, {
         key: "name",
         label: "Name",
         colType: "button"
       }, {
         key: "uhh",
         label: "uhh..",
         colType: "idk"
       }],
       items: [{
       	id: 0,
        name: "Test 0"
       }, {
       	id: 1,
        name: "Test 1"
       }, {
       	id: 2,
        name: "Test 2"
       }]
    	}
    });
    <div id="app">
      <b-table :items="items" :fields="fields">
        <template v-for="(field, index) in fields" :slot="field.key" slot-scope="data">
          <div v-if="field.colType === 'button'">
            <h5>{{data.item.name}}</h5>
            <b-button>Am Button</b-button>
          </div>
          <div v-else-if="field.colType === 'span'">
            <h5>{{data.item.name}}</h5>
            <span>Am Span</span>
          </div>
          <div v-else>
            <h5>{{data.item.name}}</h5>
            Am Confused
          </div>
        </template>
      </b-table>
    </div>
        2
  •  10
  •   Hiws    6 年前

    如果您使用的是2.0.0或更新版本的 bootstrap-vue 它们已经改变了,旧的vue插槽也被弃用,取而代之的是 v-slot

    我改变了公认的答案小提琴工作与新的命名和v槽

    new Vue({
      el: "#app",
      data: {
        fields: [{
          key: "id",
          label: "Id",
          colType: "span"
        }, {
          key: "name",
          label: "Name",
          colType: "button"
        }, {
          key: "uhh",
          label: "uhh..",
          colType: "idk"
        }],
        items: [{
          id: 0,
          name: "Test 0"
        }, {
          id: 1,
          name: "Test 1"
        }, {
          id: 2,
          name: "Test 2"
        }]
      }
    });
    <link href="https://unpkg.com/bootstrap@4.3.1/dist/css/bootstrap.min.css" rel="stylesheet" />
    <link href="https://unpkg.com/bootstrap-vue@2.0.0/dist/bootstrap-vue.css" rel="stylesheet" />
    
    <script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.6.11/vue.js"></script>
    <script src="https://unpkg.com/bootstrap-vue@2.0.0/dist/bootstrap-vue.js"></script>
    
    
    <div id="app">
      <b-table :items="items" :fields="fields">
        <template v-for="(field, index) in fields" v-slot:[`cell(${field.key})`]="data">
          <div v-if="field.colType === 'button'">
            <h5>{{data.item.name}}</h5>
            <b-button>Am Button</b-button>
          </div>
          <div v-else-if="field.colType === 'span'">
            <h5>{{data.item.name}}</h5>
            <span>Am Span</span>
          </div>
          <div v-else>
            <h5>{{data.item.name}}</h5>
            Am Confused
          </div>
        </template>
      </b-table>
    </div>
    推荐文章