关联
问题描述
CheckboxGroup 的 max 在两类边界下可以被绕过:
maxExceeded 只判断 value.length === max,当外部受控值已经大于 max 时,未选项会重新变为可选;
- 全选时按变更前的
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 的情况;
- 受控异常值不会让限制失效。
补充说明
该问题是在基于最新 develop(9e47c828a)完全重写 Checkbox 单元测试时发现。测试 PR 不修改源码,会按当前真实行为保留特征测试;源码修复时应同步更新断言。
关联
test/checkbox-coverage(PR 创建后补充链接)问题描述
CheckboxGroup 的
max在两类边界下可以被绕过:maxExceeded只判断value.length === max,当外部受控值已经大于 max 时,未选项会重新变为可选;maxExceeded判断是否停止遍历,没有按正在收集的结果限制数量。相关源码:
复现一:已有值超过 max
点击
c后仍会发出['a', 'b', 'c']。复现二:全选
点击全选会得到
['a', 'b'];max={0}时也会选中第一个普通选项。预期结果
补充说明
该问题是在基于最新
develop(9e47c828a)完全重写 Checkbox 单元测试时发现。测试 PR 不修改源码,会按当前真实行为保留特征测试;源码修复时应同步更新断言。