如何将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
相关产品推荐
相关产品推荐

