You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将Dexie读取的IndexedDB数组数据渲染到Quasar的q-table组件中

问题核心原因

你当前的问题主要是两个核心不匹配:

  • q-table当前绑定的rows是写死的静态测试数据,没有绑定从Dexie获取的thePersonArray
  • 数据库返回的对象字段名(比如f_lastName)和你定义的表格列字段名(name/lname等)不对应,需要做字段映射

具体修改步骤

1. 模板部分修改

把q-table的rows绑定改为映射后的动态数据,同时调整row-key为唯一值(建议用数据库主键,没有的话可以暂时用lname测试,最好后续换唯一ID):

<q-page>
wholething: {{ thePersonArray }}
<br/><br/>
hmmm: {{ thePersonArray[0]?.f_lastName }} <!-- 加可选链防止数组为空时报错 -->

<q-table
      title="Treats"
      :rows="tableRows" <!-- 这里替换成映射后的动态数据 -->
      :columns="columns"
      row-key="id" <!-- 如果你的person表有主键id就用这个,没有的话暂时用lname测试 -->
      binary-state-sort
    >
      <template v-slot:body="props">
        <q-tr :props="props">
          <q-td key="name" :props="props">
            {{ props.row.name }}
          </q-td>
          <q-td key="lname" :props="props">
            {{ props.row.lname }}
          </q-td>
          <q-td key="dogbreed" :props="props">
            <div class="text-pre-wrap">{{ props.row.dogbreed }}</div>
          </q-td>
          <q-td key="phone" :props="props">
            {{ props.row.phone }}
          </q-td>
        </q-tr>
      </template>
    </q-table>
</q-page>

2. Script部分修改

新增computed属性做字段映射,调整原有逻辑移除静态测试rows的返回:

import { ref, computed } from "vue" // 引入computed
import theDB from "../components/dexiedb.js"

const columns = [
    {
        name: 'name',
        label: 'First Name',
        field: 'name',         
    },
    { name: 'lname', label: 'Last Name', field: 'lname'}, 
    { name: 'dogbreed', label: 'Dog Breed', field: 'dogbreed'},
    { name: 'phone', label: 'Phone', field: 'phone'},
]

export default {
  name: "testtable",
  setup() {
    return {
        columns,
        } // 移除静态rows的返回
    },

  data() {
    return {
      thePersonArray: [],
    }
  },

  computed: {
    // 新增字段映射逻辑,把数据库的字段转成表格需要的格式
    tableRows() {
      return this.thePersonArray.map(person => {
        return {
          // 左边是表格需要的字段名,右边替换为你数据库person表里对应的实际存储字段名
          name: person.f_firstName || '', 
          lname: person.f_lastName || '',
          dogbreed: person.f_dogBreed || '', 
          phone: person.f_phone || '', 
          id: person.id // 有主键的话保留,做row-key用
        }
      })
    }
  },

  created() {
    this.getTheUsers()
  },

  methods: {
    async getTheUsers() {
      this.thePersonArray = []
      try {
        // 优化异步逻辑,直接获取所有数据后赋值,更稳定
        this.thePersonArray = await theDB.personTable.orderBy('f_lastName').toArray()
        console.log("数据加载完成", this.thePersonArray)
      } catch (err) {
        console.log("     People: Transaction aborted", err)
      }
    }
  },
}

额外说明

  • 字段映射部分一定要把右侧的属性名换成你Dexie的person表里实际存储的字段名,示例中的f_firstName/f_dogBreed仅做参考
  • 如果需要保留之前的静态测试数据,可以在computed里把静态数组合并进去:return [...静态rows数组, ...this.thePersonArray.map(xxx)]

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 18:36:05