前端心得 - vue中多选框的动态渲染、全选反选功能及数据绑定

这篇博客介绍了在Vue中如何实现多选框的动态渲染、全选反选功能以及数据绑定。作者分享了在实际项目中遇到的问题,包括使用axios获取数据、异步处理、DOM操作的避免以及如何处理勾选状态的同步。通过代码示例详细解释了每个关键步骤,特别强调了全选反选功能的实现,以及单个选项被选中时如何更新数据绑定的labelIds数组。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

vue中多选框的动态渲染、全选反选功能及数据绑定


应该是第一篇真正意义上的技术博客吧。。。

本篇内容主要是介绍一下遇到如题的需求时博主给出的解决方法,其中还遇到了不少坑(压住了自己企图写DOM操作的双手)

晚上要加班,所以时间不是很多只能匆忙写完2333

目前还是实习生,还请多多指教~~~

前情提要

项目后台的前端需要做一个文档编辑的页内组件,已经到了与后端的api对接的阶段,但是测试服务器还没有上线,所以用mock做了一模一样的接口拦截了ajax

内页大概是长这样:
内页
ui框架使用的是iView,右侧操作栏的按钮使根据表格中状态数据动态渲染出来的。其中“查看”和“编辑”按钮会路由到编辑页面。不同的是“查看”并无编辑权限(通过传递一个boolean值给组件内元素的:disabled属性解决)

编辑页面长这个样子:
编辑页面
路由props传递目标文章的id值,在页内mounted时获取数据并渲染进表单各元素,其中“渠道/门店范围”中的“级别”选项和“区域”选项为动态加载(业务需要)。

代码如下:

代码块1

        <ul class&
<think>嗯,用户的问题是在Vue3中使用vxe-table和vxe-pager实现跨多页数据的分页全选功能。我需要先理解用户的具体需求。分页全选通常指的是用户可以择当前页的所有数据,或者在翻页时保持之前中的数据,同时可能还需要一个“全选所有页”的功能。 首先,我应该回顾vxe-table和vxe-pager的文档,看看它们提供的API和事件。比如,vxe-table可能有复框列,支持中事件,而vxe-pager处理分页逻辑。用户可能需要监听分页变化事件,以确保翻页时已数据不会丢失。 接下来,考虑如何存储已中的数据。通常,在分页情况下,已数据需要存储在组件的一个变量里,比如一个数组。每次翻页时,当前页的数据可能会变化,但需要保持其他页的中状态。因此,当用户切换页面时,需要将当前页的中项合并到总的数据中。 然后,处理全选当前页的功能。vxe-table可能提供了全选当前页的方法,或者需要手动遍历当前页的数据,将它们添加到已数组中。同时,用户可能还需要一个“全选所有页”的复框,这需要与后端交互获取所有数据,或者在前端处理,但通常分页数据不在前端,所以可能需要后端接口支持获取所有数据ID,然后在前端记录这些ID。 还需要考虑性能问题,比如大量数据中时,存储和处理是否高效。可能需要使用Set数据结构来快速查找和去重。另外,分页切换时,如何高亮显示已中的行,这可能需要自定义行样式,根据数据ID判断是否中。 用户提供的引用中提到了vxe-table的复框分页择及回显数据,引用2提到需要处理行点击和复框点击事件,可能需要监听vxe-table的相关事件,比如toggleCheckboxRow和select-all。另外,引用3提到了使用节流函数优化全选操作,可能在全选所有页时需要注意性能,避免频繁调用接口,可以设置定时器或者防抖处理。 在实现步骤上,可能需要: 1. 定义存储已数据的变量,比如selectedIds,使用Set来存储中的行ID。 2. 监听vxe-table的复中事件,将当前页中的行ID添加到selectedIds中,或移除。 3. 处理全选当前页时,获取当前页的所有行ID,并合并到selectedIds。 4. 分页切换时,更新当前页数据,并在渲染时根据selectedIds设置复框的中状态。 5. 实现全选所有页的功能,可能需要调用API获取所有数据的ID,然后全选这些ID。 6. 在模板中使用vxe-table的checkbox配置,绑定相关事件和方法,比如@toggle-checkbox-row和@select-all。 7. 使用vxe-pager的分页事件,在页码变化时更新当前页数据,并保持已中的状态。 可能遇到的问题包括:分页时如何保持跨页中,如何高效存储大量中项,以及全选所有页时如何获取所有数据的ID。此外,回显中状态时,需要确保每次分页加载数据后,复框能正确显示是否被中,这可能需要设置行的checkbox的checked属性,通过判断该行ID是否在selectedIds中。 最后,需要编写示例代码,展示如何整合这些功能,并处理相关事件和数据。同时,提醒用户可能的注意事项,比如性能优化、后端接口支持等。</think>以下是在Vue3中使用vxe-table和vxe-pager实现跨页分页全选的完整解决方案: ### 一、实现思路 1. 使用$refs.tableRef.getCheckboxRecords()获取中数据[^2] 2. 通过vxe-pager的@page-change事件处理分页逻辑 3. 维护两个数据集合: - `selectedIds: Set<key>` 存储所有已ID - `currentPageKeys: Set<key>` 存储当前页存在的已ID ### 二、核心代码实现 ```vue <template> <vxe-table ref="tableRef" :data="currentPageData" @toggle-checkbox-row="handleSelect" @select-all="handleSelectAll" > <vxe-column type="checkbox" width="60"></vxe-column> <!-- 其他列 --> </vxe-table> <vxe-pager :current-page="currentPage" :page-size="pageSize" :total="total" @page-change="handlePageChange" ></vxe-pager> </template> <script setup> import { ref, reactive } from 'vue'; const selectedIds = reactive(new Set()); // 所有页中ID集合 const currentPageKeys = reactive(new Set()); // 当前页存在的已ID const currentPageData = ref([]); // 当前页数据 const currentPage = ref(1); // 分页变化处理 const handlePageChange = ({ currentPage, pageSize }) => { loadPageData(currentPage).then(data => { currentPageData.value = data; updateCurrentPageKeys(); }); }; // 更新当前页存在的已ID const updateCurrentPageKeys = () => { currentPageKeys.clear(); currentPageData.value.forEach(row => { if (selectedIds.has(row.id)) { currentPageKeys.add(row.id); } }); }; // 单个复择 const handleSelect = ({ row, checked }) => { checked ? selectedIds.add(row.id) : selectedIds.delete(row.id); updateCurrentPageKeys(); }; // 全选当前页 const handleSelectAll = ({ checked }) => { currentPageData.value.forEach(row => { checked ? selectedIds.add(row.id) : selectedIds.delete(row.id); }); updateCurrentPageKeys(); }; // 全选所有页(需后端支持) const selectAllPages = async () => { const allIds = await fetchAllIds(); allIds.forEach(id => selectedIds.add(id)); updateCurrentPageKeys(); }; </script> ``` ### 三、关键实现细节 1. **跨页数据保持**:使用`Set`数据结构存储中ID,确保唯一性和快速查找 2. **状态同步**:通过`updateCurrentPageKeys`同步当前页中状态 3. **性能优化**: - 使用`Set`代替数组提升查找效率 - 分页加载时仅维护ID集合而非完整数据[^3] 4. **视觉馈**:通过计算属性实现复框的中间状态: ```js const checkboxIndeterminate = computed(() => currentPageKeys.size > 0 && currentPageKeys.size < currentPageData.value.length ); ``` ### 四、注意事项 1. 全选所有页功能需要后端提供获取所有ID的接口 2. 大数据量场景建议使用Web Worker处理ID集合操作 3. 需要为表格设置`row-id`属性确保行标识唯一性 4. 分页切换时建议添加加载状态提示
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值