如何在 b-table 模板标签中显示来自道具的数据?

Posted

技术标签:

【中文标题】如何在 b-table 模板标签中显示来自道具的数据?【英文标题】:how to display data from props in b-table template tag? 【发布时间】:2021-03-20 14:02:59 【问题描述】:

我是 vue.js 的新手,在 b-table 中显示数据时遇到了一些问题。我从数据库中获取的数据正确。我从一个文件传递到 products.vue 并在 products.vue 中接收数据作为道具。当我控制台时,我的数据在控制台中正确显示,但是当我以前在 b 表中显示数据时,我遇到了一些问题。数据显示不正确。

请告诉我我的代码哪里出错了?

Products.vue(脚本标签)


    <script>
    export default 
            props: ['category','singular', 'plural','products'],
            data() 
                return 
                    title: `All $this.plural`,
                    items: [],
                    editing: false,
                    weight_assignment: false,
                    model: null,
                    formTitle: '',
                    fields: [
                        
                            key: 'index',
                            label: 'S.No.'
                        ,
                        
                            key: 'name',
                            sortable: true
                        ,
                        
                            key: 'weights'
                        ,
                        
                            key: 'default_weight',
                            sortable: true
                        ,
                        
                            key: 'status',
                            sortable: true
                        ,
                        
                            key: 'action'
                        
                    ],
                   
        

</script>

Product.vue(模板标签)


    <template>
        <div class="row">
            </div>
            <div class="col-12">
                <div class="card">
                    <div class="card-header">
                        <h3 class="card-title">title</h3>
                        <div class="card-tools">
                            <b-button variant="primary" @click="newItem">New singular</b-button>
                            <div></div>
                        </div>
                    </div>
                     <div class="card-body table-responsive p-0">
                        <spinner v-if="$root.loading"></spinner>
                        <b-table ref="table" v-for="type in this.products" :items="type" :key="type.id" :fields="fields" bordered hover :head-variant="'light'" responsive="sm" v-else>
                            <template v-slot:cell(index)="type">
                                 type.index + 1 
                            </template>
                            <template v-slot:cell(name)="type">
                                <b-img thumbnail fluid :src="getImageUrl(type.image)"  class="thumb-img"></b-img>
                                type.name
                            </template>
                            <template v-slot:cell(weights)="type">
                                <span v-weights="type.item"></span>
                            </template>
                            <template v-slot:cell(default_weight)="type">
                                <span v-floatFormatter="type.default_weight"></span>type.unit.sname
                            </template>
                            <template v-slot:cell(status)="type">
                                <span v-if="type.status" class="text-success text-bold">Active</span>
                                <span class="text-danger" v-else>Inactive</span>
                            </template>
                            <template v-slot:cell(action)="data">
                                <a @click.prevent="editItem(data.index)"><i class="fa fa-edit" aria-hidden="true" title="Update product" v-b-tooltip.hover></i></a>
                                <a @click.prevent="assignWeights(data.index)"><i class="fa fa-balance-scale" title="Assign weights" aria-hidden="true" v-b-tooltip.hover></i></a>
                            </template>
                        </b-table>
                    </div>
                </div>
            </div>
        </div>
    </template>

【问题讨论】:

【参考方案1】:

我尝试了很多,毕竟,我的代码现在可以正常工作了,下面给出的代码是正确的解决方案。


    <b-table ref="table" :items="products" :fields="fields" bordered hover :head-variant="'light'" responsive="sm" v-else>
                            <template v-slot:cell(index)="data">
                             data.index+1 
                            </template>
                            <template v-slot:cell(name)="data">
                            <b-img thumbnail fluid :src="getImageUrl(data.item.image)"  class="thumb-img"></b-img>
                            data.item.name
                            </template>
                            <template v-slot:cell(weights)="data">
                            <span v-weights="data.item"></span>
                            </template>
                            <template v-slot:cell(default_weight)="data">
                            <span v-floatFormatter="data.item.default_weight"></span>data.item.unit.sname
                            </template>               
                            <template v-slot:cell(status)="data">
                            <span v-if="data.status" class="text-success text-bold">Active</span>
                            <span class="text-danger" v-else>Inactive</span>
                            </template>
                            <template v-slot:cell(action)="data">
                            <a @click.prevent="editItem(data.item.id)"><i class="fa fa-edit" aria-hidden="true" title="Update product" v-b-tooltip.hover></i></a>
                            <a @click.prevent="assignWeights(data.item.id)"><i class="fa fa-balance-scale" title="Assign weights" aria-hidden="true" v-b-tooltip.hover></i></a>
                            </template>
                        </b-table>

【讨论】:

【参考方案2】:

v-for="type in this.products" - 尝试删除 this 键。在模板标签中不要使用this 关键字来访问数据或任何其他值。

我发现您以完全错误的方式传递数据。请使用以下变体并告诉我它是否有效。 已编辑模板:

<template>
    <div class="row">
    </div>
    <div class="col-12">
        <div class="card">
            <div class="card-header">
                <h3 class="card-title">title</h3>
                <div class="card-tools">
                    <b-button variant="primary" @click="newItem">New singular</b-button>
                    <div></div>
                </div>
            </div>
            <div class="card-body table-responsive p-0">
                <spinner v-if="$root.loading"></spinner>
                <b-table ref="table" :items="products" :fields="fields" bordered hover :head-variant="'light'" responsive="sm" v-else>
                    <template v-slot:cell(index)="data">
                         data.index + 1 
                    </template>
                    <template v-slot:cell(name)="data">
                        <b-img thumbnail fluid :src="getImageUrl(data.image)"  class="thumb-img"></b-img>
                        data.name
                    </template>
                    <template v-slot:cell(weights)="data">
                        <span v-weights="data.item"></span>
                    </template>
                    <template v-slot:cell(default_weight)="data">
                        <span v-floatFormatter="data.default_weight"></span>data.unit.sname
                    </template>
                    <template v-slot:cell(status)="data">
                        <span v-if="data.status" class="text-success text-bold">Active</span>
                        <span class="text-danger" v-else>Inactive</span>
                    </template>
                    <template v-slot:cell(action)="data">
                        <a @click.prevent="editItem(data.index)"><i class="fa fa-edit" aria-hidden="true" title="Update product" v-b-tooltip.hover></i></a>
                        <a @click.prevent="assignWeights(data.index)"><i class="fa fa-balance-scale" title="Assign weights" aria-hidden="true" v-b-tooltip.hover></i></a>
                    </template>
                </b-table>
            </div>
        </div>
    </div>
</template>

【讨论】:

我没有在模板标签中使用这个关键字 我在答案开头提到了粗体。 this.products 是不可接受的。将其更改为v-for="type in products" 如果这解决了您的问题,请将答案设置为已接受:) 如何在模板中使用标签打印数据? 我已经编辑了我的答案。请测试是否有帮助。

以上是关于如何在 b-table 模板标签中显示来自道具的数据?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 b-table 的 v-slot:cell() 模板中获取项目值 - BootstrapVue

如何让 Vue b-table 滚动带有固定标题的正文

在 Bootstrap Vue <b-table> 中动态创建模板槽

vue b-table 自定义分页显示所有行

在 nuxt/vue 中来自 apollo 的数据发生变化后,子元素不更新道具

如何在 VueJS 中将模板(插槽)从祖父组件传递给孙子?