<template>
<form>
姓名:<input type="text">
邮箱:<input type="text">
<button>搜索</button>
</form>
<table style="text-align: center;">
<thead >
<tr>
<th v-for="(item,index) in tableConfig" :key="index">
{{ item.title }}
</th>
</tr>
</thead>
<tbody>
<tr v-for="(item,index) in dataSource" :key="index">
<td v-for="(tableConfigItem,index) in tableConfig" :key="index">
{{item[tableConfigItem.dataIndex] }}
</td>
</tr>
</tbody>
</table>
</template>
<script setup>
import { ref } from 'vue';
import { getUserList } from '../service/users';
const tableConfig = [
{ title: 'id', dataIndex: 'id' },
{ title: '姓名', dataIndex: 'username' },
{ title: '邮箱', dataIndex: 'email'},
]
const dataSource = ref([])
const getData = async () => {
const res = await getUserList();
dataSource.value = res.data.data.record;
};
getData();
</script>
<style>
</style>
整体流程:
1.表格配置 tableConfig:
定义了一个 tableConfig 数组,它包含了表格的列配置。每个对象都有两个属性:(自定义)
title: 列的标题dataIndex: 用于从数据源中提取相应数据的键
const tableConfig = [
{ title: 'id', dataIndex: 'id' },
{ title: '姓名', dataIndex: 'username' },
{ title: '邮箱', dataIndex: 'email'},
]
2. 渲染表头:
在表头部分,使用了 v-for 来遍历 tableConfig 数组,以动态生成每一列的标题。
<th v-for="(item, index) in tableConfig" :key="index">
{{ item.title }}
</th>
{{ item.title }}: 这里使用插值语法显示每个列的标题。
3.渲染数据行:
<tr v-for="(item, index) in dataSource" :key="index">
<td v-for="(tableConfigItem, index) in tableConfig" :key="index">
{{ item[tableConfigItem.dataIndex] }}
</td>
</tr>
-
外层
v-for:v-for="(item, index) in dataSource"遍历dataSource数组,每个item代表一行数据(即一个用户对象),index是行的索引。 -
内层
v-for:在每一行中,您又遍历tableConfig数组,v-for="(tableConfigItem, index) in tableConfig"。这里的tableConfigItem是当前列的配置对象,index是列的索引。 -
数据提取:
{{ item[tableConfigItem.dataIndex] }}使用了动态属性访问的方式,从当前行的数据item中提取出对应列的数据。tableConfigItem.dataIndex会返回id、username或email,从而提取到相应的值。
总结:
这样的嵌套 v-for 结构使得表格的列和行都可以动态生成,只需要维护 tableConfig 和 dataSource 两个数组,就可以灵活地调整表格的结构和内容。这种方式提高了代码的可维护性和可读性,适合于处理不确定数量的列和行的场景。



















