Skip to content

[CheckboxGroup] max 限制可被受控值和全选绕过 #6852

Description

@zhangpaopao0609

关联

问题描述

CheckboxGroup 的 max 在两类边界下可以被绕过:

  1. maxExceeded 只判断 value.length === max,当外部受控值已经大于 max 时,未选项会重新变为可选;
  2. 全选时按变更前的 maxExceeded 判断是否停止遍历,没有按正在收集的结果限制数量。

相关源码:

const maxExceeded = computed(
  () => !isUndefined(props.max) && innerValue.value.length === props.max,
);

// getAllCheckboxValue 内
checkAllVal.add(item.value);
if (maxExceeded.value) break;

复现一:已有值超过 max

<CheckboxGroup value={['a', 'b']} max={1} options={['a', 'b', 'c']} />

点击 c 后仍会发出 ['a', 'b', 'c']

复现二:全选

<CheckboxGroup
  max={1}
  options={[
    { label: '全选', checkAll: true },
    { label: 'A', value: 'a' },
    { label: 'B', value: 'b' },
  ]}
/>

点击全选会得到 ['a', 'b']max={0} 时也会选中第一个普通选项。

预期结果

  • 达到或超过 max 后不能继续增加选中项;
  • 全选结果不超过 max,并正确处理 max 为 0 的情况;
  • 受控异常值不会让限制失效。

补充说明

该问题是在基于最新 develop9e47c828a)完全重写 Checkbox 单元测试时发现。测试 PR 不修改源码,会按当前真实行为保留特征测试;源码修复时应同步更新断言。

Metadata

Metadata

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions