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>
相关推荐
2601_958352903 分钟前
双麦 DSP 音频模块实战:一文梳理 A-68 在全行业场景的声学解决方案与落地要点
前端·嵌入式硬件·音视频·语音识别·降噪消回音·音频处理模块
智码看视界19 分钟前
老梁聊全栈:JavaScript 原型链深入探索对象继承的奥秘
前端·javascript·ecmascript
智码看视界20 分钟前
老梁聊全栈系列 JavaScript语言本质:从原型链到异步编程的深度解析
开发语言·javascript·全栈·javascript核心
布朗克16834 分钟前
39 Spring Boot Web实战
前端·spring boot·后端·实战
纽格立科技44 分钟前
DRM 发射端链路图(上)
前端·人工智能·车载系统·信息与通信·传媒
云水一下1 小时前
Vue.js从零到精通系列(七):高级特性实战——Teleport、异步组件、自定义指令与TypeScript深度结合
前端·vue.js·typescript
qq4356947011 小时前
Vue05
前端·vue.js
qq_422152571 小时前
PDF 解密工具怎么选?2026 年文档密码移除方案与注意事项
java·前端·pdf
YHHLAI1 小时前
前端工程化调用 AI 多模态生图模型:Qwen Image Demo 实战
前端·人工智能
触底反弹1 小时前
一文彻底搞懂 JavaScript 栈和队列(建议收藏)
javascript·算法·面试