【vue3+ts+ant】a-table的column绑定点击事件的两种方式

需求:给标题这一列的数据绑定点击事件,实现交互

第一种:在dom里面插入标签,并绑定点击事件

<template>
  <a-table :columns="columns" :data-source="dataSource" bordered>
    <template #bodyCell="{ column, text, record }">
      <template v-if="column.dataIndex === 'title'">
        <a @click="handleTiTle">点击标题-{{ record.title }}</a>
      </template>
    </template>
  </a-table>
</template>
<script lang="ts" setup>
	const columns = [
	  {
	    title: '标题',
	    dataIndex: 'title',
	    width: '40%',
	  },
	  {
	    title: 'operation',
	    dataIndex: 'operation',
	  },
	]
	
	const handleTiTle = () => {
		console.log("点击标题")
	}
</script>

第二种:使用column的customRender属性:customRender生成复杂数据的渲染函数,参数分别为当前行的值,当前行数据,行索引,该方法适用于二次封装后无法在dom里面插入template的情况

// 假设custom-table是封装过的a-table
<template>
	<custom-table
	  size="small"
	  :bordered="true"
	  :columns="columns"
	  :data-source="tableData"
	  :pagination="pagination"
	  :loading="loading"
	  :scroll="{ y: tableHeight }"
	/>
</template>
<script lang="tsx" setup>
	const handleTitle = () => {
		console.log("点击标题")
	}
	const columns: TableColumnType[] = [
	    {
	      title: '标题',
	      dataIndex: 'title',
	      ellipsis: true,
	      customRender: ({ record, text }) => {
	      	// customRender的返回值要遵循vue-jsx语法,要加()和换行
	        return (
	        	<a onClick={handleTitle.bind(this, text, record)}>{text}</a>
	        )
	      },
	    },
	]
</script>

注意:使用customeRender这种写法的时候有个很重要的点,就是如果是把script的部分做了剥离,放在了ts文件中通过引入的方式来使用的时候,一定要把ts文件改成tsx文件,因为ts和jsx语法有冲突,但是tsx却可以兼容jsx

例如:

<template>
	<custom-table
	  size="small"
	  :bordered="true"
	  :columns="columns"
	  :data-source="tableData"
	  :pagination="pagination"
	  :loading="loading"
	  :scroll="{ y: tableHeight }"
	/>
</template>
<script lang="ts" setup>
import useColumns from "./useColumns"

const { columns } = useColumns()
</script>
// useColumns.tsx
export default function() {
	const handleTitle = () => {
		console.log("点击标题")
	}
	
	const columns: TableColumnType[] = [
	    {
	      title: '标题',
	      dataIndex: 'title',
	      ellipsis: true,
	      customRender: ({ record, text }) => {
	        return (
	        	<a onClick={handleTitle.bind(this, text, record)}>{text}</a>
	        )
	      },
	    },
	]

	return {
		columns,
	}
}
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值