vue3+element-plus列表复选框分页保持之前的选中状态

本文介绍了如何在React应用中处理选择多个和选择全部的复选框事件,包括添加、删除操作以及如何保存和重置选择状态。还提到了处理接口数据和翻页时的状态保留问题。

复选框事件分为选择多个(@select)和选择全部(@select-all)

//entity_id为每列数组的唯一标识

const handleSelect = (selection: any, row: any) => {

    let selectType = '';

    const filterList = selection.filter((item: any) => item.entity_id === row.entity_id);

    if (filterList.length > 0) selectType = 'add';

    else selectType = 'delete';



    if (selectType === 'add') {

        const cartFilterList = cart.filter((item) => item.entity_id === row.entity_id);

        if (cartFilterList.length === 0) {

            cart.push({ ...row, deleteable: true });

        }

    } else {

        const cartFilterList = cart

            .filter((item) => item.entity_id !== row.entity_id)

            .map((item) => {

                return { ...item, deleteable: true };

            });

        cart.length = 0;

        cart.push(...cartFilterList);

    }

};

const handleSelectAll = function (selection: any) {

    if (selection.length === 0) {

        const cartFilterList = cart

            .filter((item) => {

                return tableData.value.findIndex((row: any) => row.entity_id === item.entity_id) === -1;

            })

            .map((item) => {

                return { ...item, deleteable: true };

            });

        cart.length = 0;

        cart.push(...cartFilterList);

    } else {

        const selectionFilterList = selection

            .filter((row: any) => {

                return cart.findIndex((item) => item.entity_id === row.entity_id) === -1;

            })

            .map((item: any) => {

                return { ...item, deleteable: true };

            });

        cart.push(...selectionFilterList);

    }

};

注意:将接口获取到的数据直接赋值给tableData不会触发watch事件,需要将接口返回的数据做一次处理watch事件才会触发,

// 翻页时勾选状态保留 &重置清空勾选状态

const setSelectedCheckBox = function () {

    cart.forEach((item) => {

        const targetRow = tableData.value.find((row: any) => row.entity_id === item.entity_id);

        if (targetRow) {

            tableRef.value.toggleRowSelection(targetRow, true);

        }

    });

};

watch(tableData.value, async () => {

    await nextTick();

    setSelectedCheckBox();

});



const clearCheckBox = function () {

    cart.forEach((tableItem) => {

        const targetRow = tableData.value.find((row: any) => row.entity_id === tableItem.entity_id);

        tableRef.value.toggleRowSelection(targetRow, false);

        cart.splice(cart.findIndex((item) => item.entity_id === tableItem.entity_id));

    });

};

### Vue3 Element Plus 复选框分页回显解决方案 在处理 `Vue3` 和 `Element Plus` 的表格组件时,为了实现在分页切换后保持已选择项的状态,可以采用以下方案: #### 数据结构设计 确保数据模型能够保存每一页的选择状态。通常做法是在页面级的数据对象中维护一个映射表来记录哪些行被选中。 ```javascript const selectedRowsMap = ref(new Map()); ``` 此变量用于存储每一行唯一标识符到其是否已被勾选的布尔值之间的对应关系[^1]。 #### 表格配置 当初始化表格或加载新页码的数据时,应遍历当前显示的数据集并设置默认选中的行。这可以通过监听分页事件并在每次更新视图之前同步选择状态完成。 ```html <template> <el-table :data="tableData" @selection-change="handleSelectionChange"> <!-- 列定义 --> <el-table-column type="selection" width="55"></el-table-column> ... </el-table> <div class="pagination-container"> <el-pagination layout="prev, pager, next" :total="total" @current-change="handlePageChange"/> </div> </template> ``` 每当发生分页变化时触发 `handlePageChange` 方法,在该方法内部重新计算哪几条记录应该处于选中状态,并通过编程方式调用 `toggleRowSelection()` 来恢复这些选项。 ```typescript import { ElTable } from "element-plus"; // 假设 tableRef 是指向 el-table 组件实例的一个 Ref const handlePageChange = (currentPage) => { // 获取新的数据列表... const currentSelectedKeys = Array.from(selectedRowsMap.value.keys()).filter(key => newDataList.some(item => item.id === key)); nextTick(() => { currentSelectedKeys.forEach((key) => { const row = newDataList.find(item => item.id === key); if(row){ tableRef.value.toggleRowSelection(row, true); } }); }); }; ``` 上述逻辑确保即使用户翻阅不同页面再返回原位置也能看到之前的多选结果得以保留[^2]。 对于渲染函数的具体实现细节以及如何自定义单元格内容可参见提供的 E-expand.js 文件说明;而对于属性配置方面,则需要注意像 `<el-tree-select>` 这样的控件需要正确指定 `props` 属性才能正常工作。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值