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;
    };

### 实现两个 Ant Design Table 表格共享同一个全选系统的方案 为了使两个 `Ant Design Vue` 的表格组件能够共用一个全选功能并实现联动效果,可以采用以下方法: #### 数据绑定与状态管理 通过 Vuex 或者 Reactivity API(Vue 3 中的 Composition API),将两表的状态统一到父级组件中进行集中管理。这样可以通过单一的数据源控制个子组件的行为。 以下是具体实现方式: --- #### 使用 Vue 3 的 Ref Reactive 进行数据同步 创建一个共同使用的数组来存储被选中的项,并将其作为 props 传递给两个表格组件。当任意一张表格触发全选或者单选事件时,更新这个公共数组即可自动影响另一张表格的择状态[^1]。 ```vue <template> <div> <!-- 第一个表格 --> <a-table :row-selection="rowSelection" :columns="columns" :data-source="dataSource"></a-table> <!-- 第二个表格 --> <a-table :row-selection="rowSelection" :columns="columns" :data-source="anotherDataSource"></a-table> </div> </template> <script> import { reactive, toRefs } from &#39;vue&#39;; export default { setup() { const state = reactive({ selectedRowKeys: [], // 被选中的 key 列表 allData: [] // 所有可项列表 (用于判断是否全部勾) }); const rowSelection = { onChange(selectedKeys) { state.selectedRowKeys = [...selectedKeys]; }, getCheckboxProps(record) { return { disabled: !state.allData.includes(record.key), }; } }; return { ...toRefs(state), columns: [ { title: &#39;Name&#39;, dataIndex: &#39;name&#39; }, { title: &#39;Age&#39;, dataIndex: &#39;age&#39; } ], dataSource: [{key:&#39;1&#39;, name:"John", age:20}, {key:&#39;2&#39;, name:"Doe", age:25}], anotherDataSource: [{key:&#39;3&#39;, name:"Jane", age:30}, {key:&#39;4&#39;, name:"Smith", age:35}], rowSelection, }; } }; </script> ``` 上述代码片段展示了如何利用 Vue 的响应式特性,在两张表格之间共享同一组已择记录的信息。每当任一表格发生改变时,都会重新设置全局变量 `selectedRowKeys` 来反映最新的择情况。 --- #### 功能扩展:支持跨页码全选逻辑 如果涉及到分页场景,则需额外考虑加载更页面后的处理机制。可以在初始化阶段预取所有可能存在的条目 ID 并存入 `allData` 数组内;之后无论在哪一页执行操作均能正确映射至对应实体上。 例如: - 当前显示第一页共有十条数据; - 用户点击第二页后继续保留之前所做标记而无需重复取动作。 这种设计模式不仅提升了用户体验一致性同时也简化了开发流程复杂度。 --- #### 总结 综上所述,借助 Vue 提供的强大工具集——尤其是其独特的反应体系结构——我们可以轻松达成实例间资源共享的目标。对于本案例而言就是实现了双 ATable 控件间的无缝协作关系。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

@Doraemen

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

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

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

打赏作者

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

抵扣说明:

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

余额充值