uni-app 实现表格上下左右拖拉且表头固定

本期分享内容:uni-app 实现表格上下左右拖拉且表头固定
1、实现效果
本次数据为假数据,请不用在意数据内容,精力放在数据结构
请添加图片描述
2、实现数据
表头如下数据:

		collapseList: [{
					"name": "判定详情",
					"index": 1,
					"children": [{
							"type": "input",
							"label": "领料单号",
							"prop": "IT3"
						},
						{
							"type": "input",
							"label": "工单",
							"prop": "REFWO"
						},
						{
							"type": "input",
							"label": "项目",
							"prop": "ITEMNUM"
						},
						{
							"type": "input",
							"label": "描述",
							"prop": "ITEM.DESCRIPTION"
						},
						{
							"type": "input",
							"label": "规格型号",
							"prop": "ITEM.HDMODEL"
						},
						{
							"type": "select",
							"label": "固定资产",
							"prop": "UDISASSET"
						},
						{
							"type": "operinput",
							"label": "描述分类",
							"prop": "UDASTCLASS"
						},
						{
							"type": "input",
							"label": "安装存放地点",
							"prop": "UDLOCDESC"
						},
						{
							"type": "input",
							"label": "发放单位",
							"prop": "ITEM.ISSUEUNIT"
						},
						{
							"type": "input",
							"label": "仓库",
							"prop": "STORELOC"
						},
						{
							"type": "input",
							"label": "专业",
							"prop": "BINNUM"
						},
						{
							"type": "input",
							"label": "专业描述",
							"prop": "BINNUM_DESC"
						},
						{
							"type": "input",
							"label": "批次",
							"prop": "LOTNUM"
						},
						{
							"type": "input",
							"label": "数量",
							"prop": "QUANTITY"
						},
						{
							"type": "input",
							"label": "单位成本",
							"prop": "UNITCOST"
						},
						{
							"type": "input",
							"label": "行成本",
							"prop": "LINECOST"
						},
						{
							"type": "input",
							"label": "领料人",
							"prop": "SUB_USER_NAME"
						},
						{
							"type": "input",
							"label": "交易日期",
							"prop": "TRANSDATE"
						}
					]
				}],

数据值详情:

		TableDatas: [
					[{
							"IT3": "18336",
							"REFWO": "",
							"ITEMNUM": "20002430",
							"ITEM.DESCRIPTION": "苹果",
							"ITEM.HDMODEL": "TC",
							"UDISASSET": "是",
							"UDASTCLASS": "1-01-01-01",
							"UDLOCDESC": "1",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "",
							"BINNUM_DESC": "",
							"LOTNUM": "1",
							"QUANTITY": "",
							"UNITCOST": 123,
							"LINECOST": 619,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-09 14:35:22",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18337",
							"REFWO": "",
							"ITEMNUM": "10004035",
							"ITEM.DESCRIPTION": "继电器",
							"ITEM.HDMODEL": "ST3PR",
							"UDISASSET": "是",
							"UDASTCLASS": "1-01-01-01",
							"UDLOCDESC": "2",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "",
							"BINNUM_DESC": "",
							"LOTNUM": "1",
							"QUANTITY": "",
							"UNITCOST": 49,
							"LINECOST": 49,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-09 14:36:26",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18339",
							"REFWO": "",
							"ITEMNUM": "20002430",
							"ITEM.DESCRIPTION": "油封",
							"ITEM.HDMODEL": "TC-60*85*12",
							"UDISASSET": "是",
							"UDASTCLASS": "1-01-01-02",
							"UDLOCDESC": "3",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "DLGY",
							"BINNUM_DESC": "公用",
							"LOTNUM": "3",
							"QUANTITY": "",
							"UNITCOST": 123,
							"LINECOST": 123,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-09 14:46:03",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18340",
							"REFWO": "",
							"ITEMNUM": "20002430",
							"ITEM.DESCRIPTION": "骨架",
							"ITEM.HDMODEL": "TC",
							"UDISASSET": "是",
							"UDASTCLASS": "1-01-01-03",
							"UDLOCDESC": "4",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "DLGY",
							"BINNUM_DESC": "公用",
							"LOTNUM": "3",
							"QUANTITY": 5,
							"UNITCOST": 123,
							"LINECOST": 619,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-09 14:52:11",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18341",
							"REFWO": "",
							"ITEMNUM": "20002430",
							"ITEM.DESCRIPTION": "骨油封",
							"ITEM.HDMODEL": "TC-60*85*12",
							"UDISASSET": "是",
							"UDASTCLASS": "1-01-01-04",
							"UDLOCDESC": "5",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "DLGY",
							"BINNUM_DESC": "公用",
							"LOTNUM": "3",
							"QUANTITY": 5,
							"UNITCOST": 123,
							"LINECOST": 619,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-09 14:53:38",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18342",
							"REFWO": "",
							"ITEMNUM": "20002430",
							"ITEM.DESCRIPTION": "香蕉",
							"ITEM.HDMODEL": "TC",
							"UDISASSET": "是",
							"UDASTCLASS": "1-01-01-02",
							"UDLOCDESC": "6",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "DLGY",
							"BINNUM_DESC": "公用",
							"LOTNUM": "3",
							"QUANTITY": 5,
							"UNITCOST": 123,
							"LINECOST": 619,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-09 14:58:23",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18345",
							"REFWO": "",
							"ITEMNUM": "20002430",
							"ITEM.DESCRIPTION": "草莓",
							"ITEM.HDMODEL": "60*85",
							"UDISASSET": "",
							"UDASTCLASS": "",
							"UDLOCDESC": "",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "",
							"BINNUM_DESC": "",
							"LOTNUM": "2",
							"QUANTITY": 5,
							"UNITCOST": 123,
							"LINECOST": 619,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-09 15:12:23",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18346",
							"REFWO": "",
							"ITEMNUM": "20018969",
							"ITEM.DESCRIPTION": "隔膜阀",
							"ITEM.HDMODEL": "衬胶隔膜阀",
							"UDISASSET": "",
							"UDASTCLASS": "",
							"UDLOCDESC": "",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "",
							"BINNUM_DESC": "",
							"LOTNUM": "1",
							"QUANTITY": 1,
							"UNITCOST": 256,
							"LINECOST": 256,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-18 19:21:21",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18347",
							"REFWO": "",
							"ITEMNUM": "20018969",
							"ITEM.DESCRIPTION": "隔膜阀",
							"ITEM.HDMODEL": "DN25,PN1",
							"UDISASSET": "",
							"UDASTCLASS": "",
							"UDLOCDESC": "",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "",
							"BINNUM_DESC": "",
							"LOTNUM": "1",
							"QUANTITY": 1,
							"UNITCOST": 256,
							"LINECOST": 410256,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-18 19:27:07",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18348",
							"REFWO": "",
							"ITEMNUM": "20018969",
							"ITEM.DESCRIPTION": "隔膜阀",
							"ITEM.HDMODEL": "PN1.6",
							"UDISASSET": "",
							"UDASTCLASS": "",
							"UDLOCDESC": "",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "",
							"BINNUM_DESC": "",
							"LOTNUM": "1",
							"QUANTITY": 1,
							"UNITCOST": 256.410256,
							"LINECOST": 256.410256,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-18 19:31:24",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18349",
							"REFWO": "",
							"ITEMNUM": "20018969",
							"ITEM.DESCRIPTION": "隔膜阀",
							"ITEM.HDMODEL": "DN25",
							"UDISASSET": "",
							"UDASTCLASS": "",
							"UDLOCDESC": "",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "",
							"BINNUM_DESC": "",
							"LOTNUM": "1",
							"QUANTITY": -1,
							"UNITCOST": 256.410256,
							"LINECOST": 256.410256,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-18 19:52:24",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18350",
							"REFWO": "",
							"ITEMNUM": "20018969",
							"ITEM.DESCRIPTION": "隔膜阀",
							"ITEM.HDMODEL": "DN25",
							"UDISASSET": "",
							"UDASTCLASS": "",
							"UDLOCDESC": "",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "",
							"BINNUM_DESC": "",
							"LOTNUM": "1",
							"QUANTITY": 22222,
							"UNITCOST": 410256,
							"LINECOST": 708832,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-18 19:59:56",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18351",
							"REFWO": "",
							"ITEMNUM": "20018969",
							"ITEM.DESCRIPTION": "隔膜阀",
							"ITEM.HDMODEL": "DN25",
							"UDISASSET": "",
							"UDASTCLASS": "",
							"UDLOCDESC": "",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "",
							"BINNUM_DESC": "",
							"LOTNUM": "1",
							"QUANTITY": -1,
							"UNITCOST": 410256,
							"LINECOST": 410256,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-18 20:13:48",
							"PO.HDCONTNUM": ""
						},
						{
							"IT3": "18352",
							"REFWO": "",
							"ITEMNUM": "20018969",
							"ITEM.DESCRIPTION": "隔膜阀",
							"ITEM.HDMODEL": "DN25",
							"UDISASSET": "",
							"UDASTCLASS": "",
							"UDLOCDESC": "",
							"ITEM.ISSUEUNIT": "个",
							"STORELOC": "P",
							"BINNUM": "DLGY",
							"BINNUM_DESC": "公用",
							"LOTNUM": "1",
							"QUANTITY": 1,
							"UNITCOST": 410256,
							"LINECOST": 410256,
							"SUB_USER_NAME": "管理员",
							"TRANSDATE": "2024-04-18 20:25:25",
							"PO.HDCONTNUM": ""
						}
					]
				]

表格只展示与表头prop对应字段的数据

3、实现过程
在这里插入图片描述
tr行渲染一个表头的数据,有多少个数据表示有多少行
th则是渲染数据的单元格,第一个th存放表头,之后的th存放TableDatas的数据,每行数据对应渲染表头字段的数据
例如:
表头的prop:LOTNUM---->TableDatas:LOTNUM的值

	<th v-for="(item1,index1) in TableDatas" style="padding: 10px;">
					<view v-for="(item2,index2) in item1">
						{{index2 == item4.prop ? item2:'' }}
					</view>
	</th>

TableDatas的index2,则是值,所以直接用index2 == item4.prop(item3.children里面的prop数据)

4、实现代码
代码的数据是组件形式传递过来的,数据结构跟上述一样,代码中的methods对使用表格没有什么用,是其他东西用到的方法可忽略。

<template>
	<view class="sub_table">
		<view class="sub_table_box">
			<table rules="all" class="sub_table_box_inside" >
				<tbody v-for="(item3,index3) in collapseList" :key="index3"
					style="padding: 10px;font-size: 16px;text-align: center;">
					<tr v-for="(item4,index4) in item3.children"
						v-if="item4.type =='input"
						style="background-color: #fff;">
						<th class="labelStyle">
							<view>{{item4.label}}</view>
						</th>
						<th v-for="(item1,index1) in TableDatas" style="padding: 10px;">
							<view v-for="(item2,index2) in item1">
								{{index2 == item4.prop ? item2:'' }}
							</view>
						</th>
					</tr>
				</tbody>
			</table>
		</view>
	</view>
</template>
<script>
	export default {
		data() {
			return {
				scrollTop: 0,
				activeStyle: { //选项卡选中时样式
					color: '#0080FF',
					fontWeight: '600'
				},
				swiperCurrent: 0,
				current: 0,
			}
		},
		props: {
			show: {
				type: Boolean,
				default: false
			},
			TableDatas: {
				type: Array
			},
			collapseList: {
				type: Array
			}
		},
		watch: { //监听数据是否有变化
			show(val) { //刷新方法
				console.log(val)
			},
			collapseList(val) {
				console.log(val)
			},
			TableDatas(val) {
				console.log(val)
			},
		},
		methods: {
			tabsChange(e) { // tabs通知swiper切换
				this.swiperCurrent = e.index;
				this.scrollTop = this.old.scrollTop
				this.$nextTick(() => {
					this.scrollTop = 0
				});
			},
			transition(e) {
				let dx = e.detail.dx;
			},
			animationfinish(e) {
				if (e.detail.current != this.swiperCurrent) {
					this.scrollTop = this.old.scrollTop
					this.$nextTick(() => {
						this.scrollTop = 0
					});
				}
				let current = e.detail.current;
				this.swiperCurrent = current;
				this.current = current;
			},
			close() {
				console.log('close');
				this.$emit('close')
			},
			scroll: function(e) {
				this.old.scrollTop = e.detail.scrollTop
			},
		}
	}
</script>
<style lang="scss" scoped>
	.warp {
		height: 100%;
		background-color: #FFFFFF;
		outline: 1px solid rgb(192, 192, 192);
	}

	/deep/.u-body-item {
		padding: 0px 4px;
	}

	.sub_table {
		height: 1500px;
		overflow: auto;
	}

	.sub_table_box {
		width: 100vw;
		height: 80vh;
		overflow: scroll;
		margin-top: 5px
	}

	.sub_table_box_inside {
		// width: 800px;
		height: 100px;
		text-align: center;
		border: 1px solid cornflowerblue;
		font-size: 16px;
		font-weight: 600;
	}

	.sub_table_box_inside_planTime {
		//盘点计划-计划时间
		width: 400px;
		height: 80vh;
		text-align: center;
		border: 1px solid cornflowerblue;
		font-size: 16px;
		font-weight: 600;
	}

	.table_tr {
		color: cornflowerblue;
		font-size: 16px;
	}

	.tablay_tr_name {
		width: 5%;
	}

	.tablay_tr_name_othername {
		width: 8%;
	}

	.sub_table_box_th_pdxq {
		width: 230px;
	}

	.labelStyle {
		position: sticky;
		left: 0;
		padding-top: 2%;
		width: 100px;
		padding: 15px;
		color: cornflowerblue;
		background-color: #fff;
	}
</style>

总结:
1、本次使用uni-app实现表格上下左右拖拉效果且表头固定,该表格适用于需要以表格形式展示数据的需求。
2、该表格展示的结构需要分开渲染:表头数据+表格数据
3、表头数据对应表格数据,可以用表格数据的index == 表头数据props,就可以进行得到对应数据的渲染效果了
4、本次效果为原创,敲码不容易,点赞再用喔~~~

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值