You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Vue.js中b-table无法正确展示props传递数据的问题排查

排查b-table无法展示数据的问题

我帮你梳理了代码里的几个关键问题,这些应该就是导致b-table不显示数据的核心原因:

1. Vue模板单根元素限制

你的模板里存在两个同级的根元素:<div class="row"></div><div class="col-12">...</div>,Vue 2要求模板必须只有一个根节点,这种结构会直接导致渲染异常,表格根本没法正确挂载到DOM上。

2. b-table的v-for使用错误

你给<b-table>添加了v-for="type in this.products",这会循环生成多个独立表格,且每个表格的items被绑定为单个产品对象(而非数组)——但b-table的items属性必须接收数组才能渲染出行数据。如果products本身就是产品数组,直接把:items="products"绑定给b-table即可,完全不需要循环表格。

3. 插槽props引用错误

在b-table的自定义插槽里,你直接用type.nametype.image这类写法,但实际上插槽传递的上下文对象中,当前行的真实数据是存放在item属性里的,正确的引用应该是type.item.nametype.item.image

4. v-if/v-else的结构问题

<spinner><b-table>是同级元素,v-else无法正确关联到<spinner>v-if,需要把它们放在同一个容器内,让条件渲染逻辑能正确配对。


修正后的代码片段

Products.vue (template部分)

<template>
  <!-- 修复单根元素问题,用一个div包裹所有内容 -->
  <div>
    <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">
          <!-- 修复v-if/v-else结构,放在同一个容器里 -->
          <div v-if="$root.loading">
            <spinner />
          </div>
          <b-table 
            ref="table" 
            :items="products"  <!-- 直接绑定products数组,去掉多余的v-for -->
            :fields="fields" 
            bordered 
            hover 
            :head-variant="'light'" 
            responsive="sm"
            v-else
          >
            <template v-slot:cell(index)="{ index }">
              {{ index + 1 }}
            </template>
            <template v-slot:cell(name)="{ item }">
              <b-img thumbnail fluid :src="getImageUrl(item.image)" alt="Image 1" class="thumb-img"></b-img>
              {{ item.name }}
            </template>
            <template v-slot:cell(weights)="{ item }">
              <span v-weights="item"></span>
            </template>
            <template v-slot:cell(default_weight)="{ item }">
              <span v-floatFormatter="item.default_weight"></span>{{ item.unit.sname }}
            </template>
            <template v-slot:cell(status)="{ item }">
              <span v-if="item.status" class="text-success text-bold">Active</span>
              <span class="text-danger" v-else>Inactive</span>
            </template>
            <template v-slot:cell(action)="{ index }">
              <a @click.prevent="editItem(index)"><i class="fa fa-edit" aria-hidden="true" title="Update product" v-b-tooltip.hover></i></a>
              <a @click.prevent="assignWeights(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>

额外提示

  • 如果你确实需要按类型生成多个表格,那要确保products是一个包含多组数组的二维数组(比如products = [[组1产品], [组2产品]]),然后在外层容器加v-for,每个容器内放置一个b-table并绑定对应子数组到items
  • 检查getImageUrl方法是否能正确处理item.image的值,确保图片路径有效。
  • 控制台可以打印Array.isArray(this.products)确认products确实是数组类型,避免props传递时出现类型错误。

内容的提问来源于stack exchange,提问作者user14299195

火山引擎 最新活动