实例讲解uniapp实现多选框的全选功能

 3257

本篇文章给大家带来了关于uniapp的相关知识,其中主要整理了实现多选框全选功能的相关问题,无法实现全选的原因是动态修改checkbox的checked字段时,界面上的状态能够实时变化,但是无法触发checkbox-group的change事件,下面一起来看一下,希望对大家有帮助。


实例讲解uniapp实现多选框的全选功能


uniapp内置的checkbox其实以及checkbox-group本来挺好的,但是有两个问题:

无法依赖其事件实现全选

样式固定,难以修改

他们无法实现全选的原因是:

我动态修改checkboxchecked字段时,界面上的状态能够实时变化,但是无法触发checkbox-groupchange事件。意味着无法依赖checkbox-group管理好已选项。

就是说:我点了全选,界面上看着是全选了。然后此时我取消了其中一个选项,此时触发change事件,但是它反馈给我的已选列表是错的。这是不行的。

所以我自己想了个实现全选多选框的方案。

实现思路

鉴于上面的问题,于是就可以放弃checkbox-group了,那么,我顺便就放弃了checkbox,因为我更喜欢radio的圆圈样式。

首先先模拟生成一些数据,方便展示,数据的要点是要有一个字段selected,其余随心所欲:

  1. <script setup>
  2.     import { reactive } from "vue";
  3.     // 模拟的数据对象,要是响应式的
  4.     let data = reactive([] as { id: number; text: string; selected: boolean }[]);
  5.     // 生成数据
  6.     for (let i = 0; i < 10; i++) {
  7.         data.push({
  8.             id: i + 5,
  9.             text: "标题" + i,
  10.             selected: false,
  11.         });
  12.     }
  13. </script>

然后我们需要有一个存储已选择数据信息的对象,采用map:

  1. // 存储已选内容, 因为这个列表是增删很频繁的,所以选用map而不是数组,key对应的是数据的下标。至于value存放什么,完全由自己定
  2. let selected = reactive(new Map<number, number>());

在然后我们得有一个选项框点击事件,用于选择数据或者取消选择:

  1. // 选项框点击事件,参数是数据的下标
  2. function checkbox(index: number) {
  3.     // 选中的状态下再次点击,即为取消选中
  4.     if (data[index].selected) {
  5.         data[index].selected = false;
  6.         selected.delete(index); // 然后删除对应key即可
  7.     }
  8.     // 未选中状态下点击
  9.     else {
  10.         data[index].selected = true;
  11.         selected.set(index, data[index].id);
  12.     }
  13. }

再再然后,我们还得有一个全选的点击事件:

  1. // 全选与反选事件
  2. function allSelect() {
  3.     // 已经全选情况下,就是反选,全选就说明长度一样
  4.     if (selected.size === data.length) {
  5.         selected.clear(); // 全部清除
  6.         data.forEach((element) => {
  7.             element.selected = false; // 全部不选,就行了
  8.         });
  9.     }
  10.     // 还未全选的状态下
  11.     else {
  12.         data.forEach((element, index) => {
  13.             // 因为可能存在部分已经选择了,所以得先判断是否已存在,不存在才需要添加
  14.             if (!selected.has(index)) {
  15.                 selected.set(index, element.id); // key是对应的下标index,而value是可以自定义的
  16.                 element.selected = true; // 设为选中
  17.             }
  18.         });
  19.     }
  20. }

其实上面两个点击事件都是很基本的判断和增删数据。至此功能已经全部都有了,下面看看页面怎么写:

  1. <template>
  2.     <!-- 是个多选列表 -->
  3.     <view v-for="(item, index) in data">
  4.         <label style="margin-left: 50px">
  5.             <radio :value="String(index)" :checked="item.selected" @click="checkbox(index)" />{{ item.text }}        
  6.         </label>
  7.     </view>
  8.     <!-- 全选按钮 -->
  9.     <label> <radio value="1" :checked="selected.size === data.length" @click="allSelect" />全选</label>
  10. </template>

其实就两组radio,一个是循环展示数据,一个是全选按钮。

连起来的完整代码:

  1. <template>
  2.     <!-- 是个多选列表 -->
  3.     <view v-for="(item, index) in data">
  4.         <label style="margin-left: 50px">
  5.             <radio :value="String(index)" :checked="item.selected" @click="checkbox(index)" />{{ item.text }}
  6.         </label>
  7.     </view>
  8.     <!-- 全选按钮 -->
  9.     <label> <radio value="1" :checked="selected.size === data.length" @click="allSelect" />全选</label>
  10. </template>
  11. <script setup>
  12.     import { reactive } from "vue";
  13.  
  14.     // 模拟的数据对象,要是响应式的
  15.     let data = reactive([] as { id: number; text: string; selected: boolean }[]);
  16.     // 生成数据
  17.     for (let i = 0; i < 10; i++) {
  18.         data.push({
  19.             id: i + 5,
  20.             text: "标题" + i,
  21.             selected: false,
  22.         });
  23.     }
  24.  
  25.     // 存储已选内容, 因为这个列表是增删很频繁的,所以选用map而不是数组,key对应的是数据的下标。至于value存放什么,完全由自己定
  26.     let selected = reactive(new Map<number, number>());
  27.  
  28.     // 全选与反选事件
  29.     function allSelect() {
  30.         // 已经全选情况下,就是反选,全选就说明长度一样
  31.         if (selected.size === data.length) {
  32.             selected.clear(); // 全部清除
  33.             data.forEach((element) => {
  34.                 element.selected = false; // 全部不选,就行了
  35.             });
  36.         }
  37.         // 还未全选的状态下
  38.         else {
  39.             data.forEach((element, index) => {
  40.                 // 因为可能存在部分已经选择了,所以得先判断是否已存在,不存在才需要添加
  41.                 if (!selected.has(index)) {
  42.                     selected.set(index, element.id); // key是对应的下标index,而value是可以自定义的
  43.                     element.selected = true; // 设为选中
  44.                 }
  45.             });
  46.         }
  47.     }
  48.  
  49.     // 选项框点击事件,参数是数据的下标
  50.     function checkbox(index: number) {
  51.         // 选中的状态下再次点击,即为取消选中
  52.         if (data[index].selected) {
  53.             data[index].selected = false;
  54.             selected.delete(index); // 然后删除对应key即可
  55.         }
  56.         // 未选中状态下点击
  57.         else {
  58.             data[index].selected = true;
  59.             selected.set(index, data[index].id);
  60.         }
  61.     }
  62. </script>
  63. <style></style>

看起来代码不少,其实都是很基础的逻辑判断。

最后效果是这样的:

全选:

实例讲解uniapp实现多选框的全选功能


多选:

实例讲解uniapp实现多选框的全选功能


反选全部:

实例讲解uniapp实现多选框的全选功能

本文网址:https://www.zztuku.com/detail-12414.html
站长图库 - 实例讲解uniapp实现多选框的全选功能
申明:本文转载于《CSDN》,如有侵犯,请 联系我们 删除。

评论(0)条

您还没有登录,请 登录 后发表评论!

提示:请勿发布广告垃圾评论,否则封号处理!!

    编辑推荐