Element-UI实现跨页勾选

Element-UI实现跨页勾选

最近接到了一个需求,需要保证在翻页和查询的时候,不能清除已经勾选的记录。

实现思路:使Map保存被选择的数据,<主键ID,选中状态true/false>。在执行翻页、查询操作后,遍历Map,将状态为true的数据进行勾选

核心代码:

JavaScript 复制代码
// 回显勾选状态
const handleSelectionChange = () => {
  nextTick(() => {
    tableData.value.forEach((item) => {
      console.log(map.get(item.id));
      if (map.get(item.id)) {
        tableRef.value.toggleRowSelection(item, true);
      }
    });
  });
};

全部代码

vue 复制代码
<template>
  <el-row>
    <el-form :model="form" label-width="auto" style="max-width: 600px">
      <el-form-item label="name">
        <el-input v-model="form.name" />
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="onSubmit">查询</el-button>
      </el-form-item>
    </el-form>
  </el-row>
  <el-table
    :data="tableData"
    style="width: 100%"
    @select="handleSelect"
    @select-all="handleSelect"
    ref="tableRef"
  >
    <el-table-column type="selection" width="55" />
    <el-table-column label="Date" width="120">
      <template #default="scope">{{ scope.row.date }}</template>
    </el-table-column>
    <el-table-column property="name" label="Name" width="120" />
    <el-table-column
      property="address"
      label="use show-overflow-tooltip"
      width="240"
      show-overflow-tooltip
    />
    <el-table-column property="address" label="address" />
  </el-table>
  <el-pagination
    layout="prev, pager, next"
    v-model:current-page="currentPage"
    v-model:page-size="pageSize"
    :total="globalData.length"
    @current-change="handleCurrentChange"
  />
</template>

<script lang="ts" setup>
import { ref, nextTick } from "vue";
interface User {
  id: number;
  date: string;
  name: string;
  address: string;
}

const form = ref({
  name: "",
});

const map = new Map<Number, boolean>();
const currentPage = ref(1);
const pageSize = ref(4);
const tableRef = ref();

const globalData: User[] = [
  {
    id: 1,
    date: "2016-05-04",
    name: "Aleyna Kutzner",
    address: "Lohrbergstr. 86c, Süd Lilli, Saarland",
  },
  {
    id: 2,
    date: "2016-05-03",
    name: "Helen Jacobi",
    address: "760 A Street, South Frankfield, Illinois",
  },
  {
    id: 3,
    date: "2016-05-02",
    name: "Brandon Deckert",
    address: "Arnold-Ohletz-Str. 41a, Alt Malinascheid, Thüringen",
  },
  {
    id: 4,
    date: "2016-05-01",
    name: "Margie Smith",
    address: "23618 Windsor Drive, West Ricardoview, Idaho",
  },
  {
    id: 5,
    date: "2017-05-04",
    name: "Aleyna Kutzner",
    address: "Lohrbergstr. 86c, Süd Lilli, Saarland",
  },
  {
    id: 6,
    date: "2017-05-03",
    name: "Helen Jacobi",
    address: "760 A Street, South Frankfield, Illinois",
  },
  {
    id: 7,
    date: "2017-05-02",
    name: "Brandon Deckert",
    address: "Arnold-Ohletz-Str. 41a, Alt Malinascheid, Thüringen",
  },
  {
    id: 8,
    date: "2017-05-01",
    name: "Margie Smith",
    address: "23618 Windsor Drive, West Ricardoview, Idaho",
  },
];
const tableData: User[] = ref(globalData.slice(0, 4));

// 发生页面变化
const handleCurrentChange = (val: number) => {
  const start = (val - 1) * pageSize.value;
  const end = start + pageSize.value;
  tableData.value = globalData.slice(start, end);
  handleSelectionChange();
};

// 选择数据
const handleSelect = (selection: User[]) => {
  for (const elem of tableData.value) {
    const { id } = elem;
    const tlist = selection.filter((item) => item.id === id);
    map.set(id, tlist.length > 0);
  }
};

// 查询数据
const onSubmit = () => {
  const { name } = form.value;
  if (!name) {
    handleCurrentChange(1);
    return;
  }
  const filteredData = globalData.filter((item) => item.name.includes(name));
  tableData.value = filteredData;
  handleSelectionChange();
};

// 回显勾选状态
const handleSelectionChange = () => {
  nextTick(() => {
    tableData.value.forEach((item) => {
      console.log(map.get(item.id));
      if (map.get(item.id)) {
        tableRef.value.toggleRowSelection(item, true);
      }
    });
  });
};
</script>
相关推荐
kyriewen24 分钟前
我筛了 1400 个 Claude Code Skills,留下 5 个天天在用的
前端·ai编程·claude
JNX_SEMI38 分钟前
AT2401C 2.4GHz 全集成射频前端单芯片技术解析
前端·单片机·嵌入式硬件·物联网·硬件工程
anOnion1 小时前
Agentic 前端开发之 实时显示 AI Agent 终端输出
前端·javascript·人工智能
随风一样自由1 小时前
【前端领域】2026最新前端领域全梳理(框架/工具/AI/跨端/底层标准/就业趋势)
前端·人工智能·前端框架
这是个栗子1 小时前
【前端性能优化】优化数据加载:用 Promise.all 从串行到并行
前端·javascript·性能优化·异步编程·前端优化·promise.all
fei_sun2 小时前
黑洞路由(Null Route/空接口路由)
服务器·前端·javascript
大爱一家盟2 小时前
告别卡点BGM同质化 2026原创卡点音乐素材下载网站 TOP5 推荐
大数据·前端·人工智能
彦为君2 小时前
算法思维与经典智力题
java·前端·redis·算法
aa小小3 小时前
localhost 访问异常排查笔记
前端
格子软件3 小时前
2026年GEO优化系统源码的分布式状态机深度拆解
java·前端·vue.js·vue·geo