vue3+antd 多选框全选和单选联动

本文展示了如何在Vue中使用AntDesignVue组件库实现多选与单选联动的效果,主要涉及checkbox组、collapse折叠面板及状态管理。代码包括HTML结构、JavaScript逻辑,涉及checkAllChange和onCheckChange两个关键方法,用于处理全选和单个选项的选择状态更新。

实现效果

多选单选联动

主要代码

一,html部分

   <a-form-item label="功能权限" name="scope">
            <div v-for="(item, index) in scopeList" :key="index">
              <a-collapse v-model:activeKey="activeKey" collapsible="icon">
                <template #expandIcon="{ isActive }">
                  <RightOutlined :rotate="isActive ? 90 : 0" />
                </template>
                <a-collapse-panel :key="index.toString()" :showArrow="true">
                  <template #header>
                    <div @Click="(e) => e.stopPropagation()">
                      <a-checkbox
                        v-model:checked="item.checkAll"
                        :indeterminate="item.indeterminate"
                        name="all"
                        @change="checkAllChange($event, index)"
                        >{{ item.name }}
                      </a-checkbox>
                    </div>
                  </template>
                  <a-checkbox-group
                    v-model:value="item.checkedList"
                    @change="onCheckChange($event, index)"
                  >
                    <div class="flex-box">
                      <div
                        v-for="(i, ind) in item.children"
                        :key="ind"
                        class="check-span"
                      >
                        <a-checkbox
                          :value="i.id"
                          class="has-plan-padding"
                          name="all"
                        >
                          <span>{{ i.name }}</span>
                        </a-checkbox>
                      </div>
                    </div>
                  </a-checkbox-group>
                </a-collapse-panel>
              </a-collapse>
            </div>
          </a-form-item>

二,js部分

这里需求不止一个服务管理,所以是一个数组格式,可根据需求调整代码

   const state = reactive({
      scopeList: [
        {
          name: "服务管理",
          checkedList: ref([] as any),
          indeterminate: false,
          checkAll: false,
          children: [
            {
              name: "新增服务",
              id: 0,
            },
            {
              name: "分组管理",
              id: 1,
            },
            {
              name: "样式设置",
              id: 2,
            },
            {
              name: "批量操作",
              id: 3,
            },
            {
              name: "编辑",
              id: 4,
            },
            {
              name: "删除",
              id: 5,
            },
          ],
        },
      ],
    });

三,多选方法

    const checkAllChange = (event, index) => {
      let withOutPmIds = state.scopeList[index].children.map((item) => {
        return item.id;
      });
      state.scopeList[index].checkedList = event.target.checked
        ? withOutPmIds
        : [];
    };

四,单选方法

  const onCheckChange = (event, index) => {
      const checkedLength = state.scopeList[index].checkedList.length;
      const listLength = state.scopeList[index].children.length;
      state.scopeList[index].indeterminate =
        !!checkedLength && checkedLength < listLength;
      state.scopeList[index].checkAll =
        checkedLength > 0 && checkedLength === listLength;
    };

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

@Doraemen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值