uniapp 之 uni-table组件添加行点击事件

本文介绍了两种在uni-app中为uni-table组件添加行点击事件的方法。第一种方案是在mounted生命周期里通过DOM操作为表格行添加事件监听器,而第二种方案是通过组件通信,在tr组件内部触发事件并传递给父组件。两种方案均适用于H5环境,小程序端可能需要调整,因为无法直接获取DOM节点。
摘要由CSDN通过智能技术生成

  由于 uniapp官网的uni-table组件 并没有给出添加行点击事件的events,于是自己想方法基于uni-table组件实现了表格行点击事件;

第一种方案(不改变导入的 tr 组件)

<uni-table border stripe emptyText="暂无更多数据" :loading="loading">
    <!-- 表头行 -->
    <uni-tr>
        <uni-th align="center" width="50">姓名</uni-th>
        <uni-th align="center" width="50">年龄</uni-th>
        <uni-th align="center" width="50">地址</uni-th>
    </uni-tr>
    <!-- 表格数据行 -->
    <uni-tr v-for="item in tableData" :key="item.id">
        <uni-td align="center">{{ item.name }}</uni-td>
        <uni-td align="center">{{ item.age }}</uni-td>
        <uni-td align="center">{{ item.address }}</uni-td>
    </uni-tr>
</uni-table>

mounted 生命周期里面找到行元素,并给每个行元素设置点击事件(表头行除外)

mounted() {
	let that = this; // 箭头函数的写法可省略这行代码
	let trDoms = document.getElementsByClassName('uni-table-tr');
	let len = trDoms.length;
	for(let i = 0; i < len; i++) {
		let item = trDoms[i];
		 // table为表格绑定的数据
		 // 表头行除外直接通过this.tableData[i - 1] 是否存在判断即可
		if(this.tableData[i - 1]) {
		
			// 这里使用了箭头函数的写法,如果使用的function 的写法,请注意this的指向问题
			item.onclick = () => {
				let row = this.tableData[i - 1];
				this.getCurrentRow(row);
			};
			// function 的写法:
			// item.onclick = function() {
			//     let row = that.tableData[i - 1];
			//     that.getCurrentRow(row);
			// };
		}
	}
},
methods: {
	getCurrentRow(row) {
		console.log(row);
	}
}

这里需要注意的是,不能在uniapp 自带的页面生命周期onLoad中使用,注意该生命周期的说明:
在这里插入图片描述


第二种方案(改变 tr 组件)

利用组件之间的通信

业务界面:

<uni-table border stripe emptyText="暂无更多数据" :loading="loading">
    <!-- 表头行 -->
    <uni-tr>
        <uni-th align="center" width="50">姓名</uni-th>
        <uni-th align="center" width="50">年龄</uni-th>
        <uni-th align="center" width="50">地址</uni-th>
    </uni-tr>
    <!-- 表格数据行 -->
    <uni-tr v-for="item in tableData" :key="item.id" @row-click="rowclick(item)">
        <uni-td align="center">{{ item.name }}</uni-td>
        <uni-td align="center">{{ item.age }}</uni-td>
        <uni-td align="center">{{ item.address }}</uni-td>
    </uni-tr>
</uni-table>
methods: {
	rowclick(item) {
		console.log('item', item);
	}
}

tr 组件界面中给uni-table-tr定义一个 click 事件

<template>
    <view class="uni-table-tr" @click="getRow">
        <checkbox-group v-if="selection === 'selection'" class="checkbox" :class="{'tr-table--border':border}" @change="change">
            <label>
                <checkbox value="check" :checked="value"/>
            </label>
        </checkbox-group>
        <slot></slot>
    </view>
</template>

然后在tr组件中的 methods中定义方法给父组件调用

methods: {
	getRow() {
		this.$emit("row-click")
	},
	// 其他方法就不显示了
	。
	。
	。
}

完美实现!


写在末尾

这里的代码测试环境是在H5环境中,未能进行多端测试是否兼容的问题;
如果是小程序端,由于获取不到dom节点,可以考虑使用第二种方案试下。


如有不足,望大家多多指点! 谢谢!

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

zhuangv

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值