el-table setCurrentRow会触发current-change函数 解决方案

解决el-table setCurrentRow会触发current-change函数问题

javascript 复制代码
<template>
// 直接运行即可
  <template>
  <el-table
      ref="singleTableRef"
      :data="tableData"
      highlight-current-row
      style="width: 100%"
      @current-change="handleCurrentChange"
  >
    <el-table-column type="index" width="50"/>
    <el-table-column property="date" label="Date" width="120"/>
    <el-table-column property="name" label="Name" width="120"/>
    <el-table-column property="address" label="Address"/>
  </el-table>
</template>

<script setup>
import { ref, onMounted, nextTick } from 'vue';

const data = [
  { id: 1, date: '2016-05-03', name: 'Tom', address: 'No. 189, Grove St, Los Angeles' },
  { id: 2, date: '2016-05-02', name: 'Tom', address: 'No. 189, Grove St, Los Angeles' },
  { id: 3, date: '2016-05-04', name: 'Tom', address: 'No. 189, Grove St, Los Angeles' },
  { id: 4, date: '2016-05-01', name: 'Tom', address: 'No. 189, Grove St, Los Angeles' },
];

const singleTableRef = ref(null); // ref
const tableData = ref([]); // 表格数据
const isUpdating = ref(false); // 用于防止死循环的标识(重点)

// 高亮函数
const setCurrent = (row) => {
  if (singleTableRef.value && !isUpdating.value) {
    nextTick(() => {
      isUpdating.value = true; // 页面渲染完设置为true
      singleTableRef.value.setCurrentRow(row); // 执行高亮
      isUpdating.value = false; // 高亮之后设置为false(防止自执行current-change函数,如果不设置为false,那么就会去触发current-change函数)
    });
  }
};

const handleCurrentChange = (val) => {
  if (isUpdating.value || !val) return; // Prevent loop and handle null/undefined(防止循环和处理null/undefined)

  // Simulate async data update(模拟异步信息-)
  // setTimeout可以换做接口返回数据
  setTimeout(() => {
    const updatedData = [
      { id: 1, date: '2016-05-03', name: '小王', address: 'No. 189, Grove St, Los Angeles' },
      { id: 2, date: '2016-05-02', name: '小王', address: 'No. 189, Grove St, Los Angeles' },
      { id: 3, date: '2016-05-04', name: '小王', address: 'No. 189, Grove St, Los Angeles' },
      { id: 4, date: '2016-05-01', name: '小王', address: 'No. 189, Grove St, Los Angeles' }
    ];

    tableData.value = updatedData; // 用最新的数据或者深拷贝

    nextTick(() => {
      // find查找符合条件的
      const currentRow = updatedData.find(item => item.id === val.id);
      if (currentRow) {
        // 设置高亮
        setCurrent(currentRow);
      }
    });
  }, 1000);
};

onMounted(() => {
  // 这块设置默认选中一项
  setTimeout(() => {
    tableData.value = data;
    nextTick(() => {
      setCurrent(data[1]);
    });
  }, 800);
});
</script>
相关推荐
2501_9437823516 分钟前
【共创季稿事节】猜数字游戏:二分法思维与交互式反馈
前端·游戏·microsoft·harmonyos·鸿蒙·鸿蒙系统
GV191rLvq30 分钟前
基于Socket实现的最简单的Web服务器【ASP.NET原理分析】
服务器·前端·asp.net
吠品37 分钟前
LangChain 里 tool_call_id 为空?一次 MCP 工具集成的排查记录
前端
柒和远方1 小时前
Phase 7.4 学习博客:为什么多 API 项目需要 Swagger / OpenAPI
前端·后端·架构
张龙6871 小时前
拼多多开放平台对接踩坑实录:从 CLIENT_ID 配置到 MD5 签名算法的完整填坑指南
前端
GuWenyue1 小时前
提示词彻底过时?一套上下文工程方案,3步让LLM落地生产,代码直接复用
前端·javascript·人工智能
柒和远方1 小时前
Phase 7.3 复盘:后台任务不只是“扔进队列”,还要能被看见
前端·后端·架构
2501_943782351 小时前
【共创季稿事节】 倒计时器:时分秒选择器与定时器的协同工作
前端·华为·harmonyos·鸿蒙·鸿蒙系统
奶油mm1 小时前
公司技术债堆积如山,我一人之力用 Vue3 偷换了整个前端架构
前端·vue.js
用户938515635071 小时前
深入理解 JavaScript 中的 this 与数据存储的奥秘
前端·javascript