uniapp 表格,动态表头表格封装渲染

1.接口表格数据:

{
    "headers": [
        {
            "label": "实例名",
            "name": "v1",
            "order": 1,
            "hide": false,
            "dateTypeValue": null
        },
        {
            "label": "所属科室",
            "name": "v4",
            "order": 1,
            "hide": false,
            "dateTypeValue": "/sso-management/department/getDepById?"
        },
        {
            "label": "实例状态",
            "name": "v3",
            "order": 1,
            "hide": false,
            "dateTypeValue": "/cmdb/dict/query?args=example_state&"
        },
        {
            "label": "esc_Ip",
            "name": "v2",
            "order": 1,
            "hide": false,
            "dateTypeValue": null
        },
        {
            "label": "测试1",
            "name": "test1",
            "order": 1,
            "hide": false,
            "dateTypeValue": null
        },
        {
            "label": "测试2",
            "name": "test2",
            "order": 1,
            "hide": false,
            "dateTypeValue": null
        },
        {
            "label": "测试3",
            "name": "test3",
            "order": 1,
            "hide": false,
            "dateTypeValue": null
        }
    ],
    "bodyData": {
        "total": 4,
        "list": [
            {
                "test2": null,
                "test3": null,
                "v1": "ESC_001",
                "v2": "127.0.0.1",
                "v3": null,
                "test1": null,
                "v4": null,
                "ROW_ID": 1
            },
            {
                "test2": null,
                "test3": null,
                "v1": "ESC_002",
                "v2": "127.0.0.1",
                "v3": null,
                "test1": null,
                "v4": null,
                "ROW_ID": 2
            },
            {
                "test2": null,
                "test3": null,
                "v1": "ESC_003",
                "v2": "127.0.0.1",
                "v3": null,
                "test1": null,
                "v4": null,
                "ROW_ID": 3
            },
            {
                "test2": null,
                "test3": null,
                "v1": "ESC_004",
                "v2": "192.168.0.1",
                "v3": null,
                "test1": null,
                "v4": null,
                "ROW_ID": 4
            }
        ],
        "pageNum": 1,
        "pageSize": 4,
        "size": 4,
        "startRow": 0,
        "endRow": 3,
        "pages": 1,
        "prePage": 0,
        "nextPage": 0,
        "isFirstPage": true,
        "isLastPage": true,
        "hasPreviousPage": false,
        "hasNextPage": false,
        "navigatePages": 8,
        "navigatepageNums": [
            1
        ],
        "navigateFirstPage": 1,
        "navigateLastPage": 1,
        "firstPage": 1,
        "lastPage": 1
    }
}

2.结构:(表格内容渲染注意,需要先循环表格数据tr代表有多少行数据,再循环表头数据td取对应的字段内容,渲染)

<view class="tableStyle">
			<table>
				<th>
				<td v-for="(header, index) in tableInfo.columns" :key="index">
					{{ header.label }}
				</td>
				</th>
				<tr v-for="(item, i) in tableInfo.list" :key="i" @click="goToDetail(item)">
					<td v-for="(header, index) in tableInfo.columns" :key="index">
						{{item[header['name']] }}
					</td>
				</tr>
			</table>
		</view>

3.样式

.tableStyle {
			width: 100%;
			margin-top: 40rpx;
			padding-top: 20rpx;
			background-color: #fff;
			overflow-y: hidden;
			overflow-x: auto;

			table {
				width: 100% !important;
			}

			th {
				width: 100%;
				display: flex;
				flex-direction: row;
				justify-content: space-around;
				align-items: center;
				font-weight: 550;
				color: #2F80ED;
				font-size: 14px;
				padding: 12px 4px;
				background: #F3F6FA;

				td {
					display: inline-block;
					min-width: 100px;
					text-align: center;
				}
			}

			tr {
				width: 100%;
				display: flex;
				flex-direction: row;
				justify-content: space-around;
				align-items: center;
				font-size: 14px;
				font-weight: 400;
				padding: 12px 4px;

				td {
					text-align: center;
					font-size: 14px;
					font-weight: 400;
					display: inline-block;
					min-width: 100px;
					text-align: center;
				}
				&:nth-child(2n+1) {
					background: #F3F6FA;
				}
			}
		}

二、第二种方式,用uni-table组件渲染

官网uniapp-table组件地址:uni-app官网

1.结构:

<view class="uni-container">
			<uni-table ref="table" border stripe emptyText="暂无更多数据">
				<uni-tr>
					<uni-th align="center" v-for="(header, index) in tableInfo.columns"
						:key="index">{{header.label}}</uni-th>
				</uni-tr>
				<uni-tr v-for="(item, i) in tableInfo.list" :key="i" @click="goToDetail(item)">
					<uni-td align="center" v-for="(header, index) in tableInfo.columns" :key="index">{{item[header['name']] }}</uni-td>
				</uni-tr>
			</uni-table>
		</view>

2.数据同上

3.渲染完成

### 关于 Vant 表格组件的使用说明 Vant 是一款轻量级移动端 UI 组件库,提供了丰富的组件来满足开发者的日常需求。虽然 Vant 官方并未提供专门的「表格」组件[^2],但在实际项目中可以通过自定义方式结合其他基础组件(如 `Cell` 或 `Grid`)实现表格功能。 以下是基于 UniApp 和 React 的两种实现思路: --- #### 方法一:在 UniApp 中使用 Table 自定义组件 如果需要在 UniApp 项目中实现表格效果,可以参考以下代码示例。此方法通过封装一个通用的表格组件并传入表头 (`headers`) 和内容数据 (`rows`) 来完成渲染[^1]。 ```vue <template> <view class="table-container"> <!-- 表头 --> <view class="header-row"> <view v-for="(header, index) in headers" :key="index" class="cell">{{ header }}</view> </view> <!-- 数据行 --> <view v-for="(row, rowIndex) in rows" :key="'row-' + rowIndex" class="data-row"> <view v-for="(cell, cellIndex) in row" :key="'cell-' + cellIndex" class="cell">{{ cell }}</view> </view> </view> </template> <script> export default { props: { headers: { type: Array, required: true }, // 表头数组 rows: { type: Array, required: true } // 数据二维数组 } }; </script> <style scoped> .table-container .header-row, .data-row { display: flex; } .cell { border: 1px solid #ccc; padding: 8px; text-align: center; width: 33%; /* 可调整列宽 */ } .header-row .cell { font-weight: bold; } </style> ``` 调用该组件时只需传递对应的 `headers` 和 `rows` 属性即可。 --- #### 方法二:在 React 中模拟表格结构 对于 React 开发者来说,也可以利用简单的 JSX 结构构建表格。尽管 Vant 并未直接支持表格组件,但其核心理念在于组合现有组件形成更复杂的功能模块。 下面是一个基本的例子,展示了如何通过 `List` 和 `Cell` 实现类似表格的效果: ```jsx import React from 'react'; import { List, Cell } from 'vant'; const DataTable = ({ headers, data }) => ( <> {/* 渲染表头 */} <List className="table-header"> {headers.map((header, idx) => ( <Cell key={idx} title={header} /> ))} </List> {/* 渲染每一行数据 */} {data.map((rowData, rowIndex) => ( <List key={`row-${rowIndex}`} className="table-data"> {Object.values(rowData).map((value, colIndex) => ( <Cell key={`${rowIndex}-${colIndex}`} title={value.toString()} /> ))} </List> ))} </> ); // 使用示例 const App = () => { const tableHeaders = ['姓名', '年龄', '城市']; const tableData = [ { name: '张三', age: 20, city: '北京' }, { name: '李四', age: 25, city: '上海' }, ]; return <DataTable headers={tableHeaders} data={tableData} />; }; export default App; ``` 上述代码片段中,`List` 和 `Cell` 被用来替代传统的 HTML `<tr>` 和 `<td>` 标签。 --- #### 错误处理与动态更新 当涉及到动态数据加载或错误提示时,可借鉴 Vant 提供的状态管理机制。例如,在校验失败的情况下向页面反馈信息[^3]: ```javascript state = { errorMessage: { pwdInput: '' } } handlePasswordValidation = (password) => { if (!/^[a-zA-Z0-9]{6,}$/.test(password)) { this.setState({ errorMessage: { ...this.state.errorMessage, pwdInput: '密码输入错误!' } }); } } ``` 随后可以在模板中绑定这些状态变量以实时反映变化。 --- ### 总结 由于 Vant 原生不包含独立的表格组件,开发者需灵活运用已有工具集创造所需界面形式。无论是 Vue 还是 React 生态下,均能借助简单布局配合逻辑控制达成目标。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值