Skip to content

Commit

Permalink
fix(checkbox): support custom node in checkbox group (#2604)
Browse files Browse the repository at this point in the history
* fix(checkbox): support custom node in checkbox group

* test(checkbox): update snapshots

* fix(checkbox): update snapshots
  • Loading branch information
chaishi authored Jul 24, 2023
1 parent 63c4b1e commit 5b418a9
Show file tree
Hide file tree
Showing 4 changed files with 30 additions and 12 deletions.
16 changes: 12 additions & 4 deletions src/checkbox/_example/group.vue
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,12 @@
</t-space>

<!-- key 是避免重复渲染的关键;Checkbox.key is the key point of list render -->
<!-- 数据量大的情况下,不建议使用这种方式:因父组件 CheckboxGroup 选中项变化,子组件 Checkbox 一定重新渲染-->
<!-- 数据量大的情况下,不建议使用这种方式:因 Vue2 框架中,父组件 CheckboxGroup 选中项变化,子组件 Checkbox 一定全量重新渲染-->
<t-space direction="vertical">
<div>方式二:组件内置全选功能,使用插槽定义选项。选中值: {{ value2.join(', ') }}</div>
<div>
方式二:组件内置全选功能,使用插槽定义选项。⚠️注意:数据量大时,不建议使用这种方式。选中值:
{{ value2.join(', ') }}。
</div>
<t-checkbox-group v-model="value2" @change="onChange2">
<t-checkbox key="1" :checkAll="true" label="全选" />
<t-checkbox key="2" value="选项一">选项一</t-checkbox>
Expand All @@ -22,13 +25,18 @@

<!-- 数据量大的情况下,建议使用这种方式,可以避免选中项重复渲染 -->
<t-space direction="vertical">
<div>方式三:组件内置全选功能,使用 `options` 定义选项。选中值: {{ value3.join(', ') }}</div>
<div>
方式三:组件内置全选功能,使用 `options` 定义选项。数据量大时,可以避免所有元素重新渲染。选中值:
{{ value3.join(', ') }}
</div>
<t-checkbox-group v-model="value3" :options="options2" @change="onChange3" />
</t-space>

<!-- 数据量大的情况下,建议使用这种方式,可以避免选中项重复渲染 -->
<t-space direction="vertical">
<div>方式四:组件内置全选功能,`options` 定义选项列表,插槽定义选项内容</div>
<div>
方式四:组件内置全选功能,`options` 定义选项列表,插槽定义选项内容。数据量大时,可以避免所有元素重新渲染。
</div>
<t-checkbox-group :defaultValue="['选项一']" :options="options3">
<template #label="{ data: { label, value, checkAll }, index }">
<span v-if="checkAll">{{ label }}</span>
Expand Down
18 changes: 14 additions & 4 deletions src/checkbox/group.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -177,12 +177,25 @@ export default defineComponent({
{ immediate: true },
);

const addStoreKeyToCheckbox = (nodes: VNode[]) => {
for (let i = 0, len = nodes.length; i < len; i++) {
const vNode = nodes[i];
if (vNode.componentOptions && /TCheckbox/.test(vNode.tag)) {
(vNode.componentOptions.propsData as any).storeKey = storeKey;
}
if (vNode.children?.length) {
addStoreKeyToCheckbox(vNode.children);
}
}
};

return {
storeKey,
optionList,
innerValue,
COMPONENT_NAME,
getOptionListBySlots,
addStoreKeyToCheckbox,
};
},

Expand All @@ -204,10 +217,7 @@ export default defineComponent({
} else {
const nodes = this.$scopedSlots.default?.(null);
this.optionList = this.getOptionListBySlots();
nodes.forEach((vNode: VNode) => {
// eslint-disable-next-line
(vNode.componentOptions.propsData as any).storeKey = this.storeKey;
});
this.addStoreKeyToCheckbox(nodes);
children = nodes;
}
return (
Expand Down
6 changes: 3 additions & 3 deletions test/snap/__snapshots__/csr.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -24660,7 +24660,7 @@ exports[`csr snapshot test > csr test ./src/checkbox/_example/group.vue 1`] = `
class="t-space-item"
>
<div>
方式二:组件内置全选功能,使用插槽定义选项。选中值: 选项一
方式二:组件内置全选功能,使用插槽定义选项。⚠️注意:数据量大时,不建议使用这种方式。选中值: 选项一
</div>
</div>
<div
Expand Down Expand Up @@ -24762,7 +24762,7 @@ exports[`csr snapshot test > csr test ./src/checkbox/_example/group.vue 1`] = `
class="t-space-item"
>
<div>
方式三:组件内置全选功能,使用 \`options\` 定义选项。选中值: 选项一, 选项二, 选项三
方式三:组件内置全选功能,使用 \`options\` 定义选项。数据量大时,可以避免所有元素重新渲染。选中值: 选项一, 选项二, 选项三
</div>
</div>
<div
Expand Down Expand Up @@ -24866,7 +24866,7 @@ exports[`csr snapshot test > csr test ./src/checkbox/_example/group.vue 1`] = `
class="t-space-item"
>
<div>
方式四:组件内置全选功能,\`options\` 定义选项列表,插槽定义选项内容
方式四:组件内置全选功能,\`options\` 定义选项列表,插槽定义选项内容。数据量大时,可以避免所有元素重新渲染。
</div>
</div>
<div
Expand Down
2 changes: 1 addition & 1 deletion test/snap/__snapshots__/ssr.test.js.snap
Original file line number Diff line number Diff line change
Expand Up @@ -232,7 +232,7 @@ exports[`ssr snapshot test > renders ./src/checkbox/_example/base.vue correctly

exports[`ssr snapshot test > renders ./src/checkbox/_example/controlled.vue correctly 1`] = `"<div data-server-rendered=\\"true\\" class=\\"t-space t-space-vertical\\" style=\\"gap:36px;\\" data-v-032bf202><div class=\\"t-space-item\\"><div class=\\"t-space t-space-horizontal\\" style=\\"gap:16px;\\" data-v-032bf202><div class=\\"t-space-item\\"><label tabindex=\\"0\\" class=\\"t-checkbox t-is-checked\\" data-v-032bf202><input type=\\"checkbox\\" tabindex=\\"-1\\" checked=\\"checked\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">语法糖(v-model)</span></label></div><div class=\\"t-space-item\\"><label tabindex=\\"0\\" class=\\"t-checkbox t-is-checked\\" data-v-032bf202><input type=\\"checkbox\\" tabindex=\\"-1\\" checked=\\"checked\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">受控属性</span></label></div><div class=\\"t-space-item\\"><label tabindex=\\"0\\" class=\\"t-checkbox\\" data-v-032bf202><input type=\\"checkbox\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">非受控属性</span></label></div></div></div><div class=\\"t-space-item\\"><div role=\\"group\\" aria-label=\\"checkbox-group\\" class=\\"t-checkbox-group\\" data-v-032bf202><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">全选</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">受控模式选项一</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"2\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">受控模式选项二</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"3\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">受控模式选项三</span></label></div></div></div>"`;

exports[`ssr snapshot test > renders ./src/checkbox/_example/group.vue correctly 1`] = `"<div data-server-rendered=\\"true\\" class=\\"t-space t-space-vertical\\" style=\\"gap:48px;\\"><div class=\\"t-space-item\\"><div class=\\"t-space t-space-vertical\\" style=\\"gap:16px;\\"><div class=\\"t-space-item\\"><div>方式一:业务侧自定义全选功能。选中值: 选项一</div></div><div class=\\"t-space-item\\"><div><label tabindex=\\"0\\" class=\\"t-checkbox t-is-indeterminate\\"><input type=\\"checkbox\\" indeterminate=\\"indeterminate\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">全选</span></label></div></div><div class=\\"t-space-item\\"><div role=\\"group\\" aria-label=\\"checkbox-group\\" class=\\"t-checkbox-group\\"><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项一\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><div>选项一</div></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项二\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项二</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项三\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项三</span></label></div></div></div></div><div class=\\"t-space-item\\"><div class=\\"t-space t-space-vertical\\" style=\\"gap:16px;\\"><div class=\\"t-space-item\\"><div>方式二:组件内置全选功能,使用插槽定义选项。选中值: 选项一</div></div><div class=\\"t-space-item\\"><div role=\\"group\\" aria-label=\\"checkbox-group\\" class=\\"t-checkbox-group\\"><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">全选</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项一\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项一</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项二\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项二</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项三\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项三</span></label></div></div></div></div><div class=\\"t-space-item\\"><div class=\\"t-space t-space-vertical\\" style=\\"gap:16px;\\"><div class=\\"t-space-item\\"><div>方式三:组件内置全选功能,使用 \`options\` 定义选项。选中值: 选项一, 选项二, 选项三</div></div><div class=\\"t-space-item\\"><div role=\\"group\\" aria-label=\\"checkbox-group\\" class=\\"t-checkbox-group\\"><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">全选</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项一\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项一</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项二\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><div>选项二</div></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项三\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项三</span></label></div></div></div></div><div class=\\"t-space-item\\"><div class=\\"t-space t-space-vertical\\" style=\\"gap:16px;\\"><div class=\\"t-space-item\\"><div>方式四:组件内置全选功能,\`options\` 定义选项列表,插槽定义选项内容</div></div><div class=\\"t-space-item\\"><div role=\\"group\\" aria-label=\\"checkbox-group\\" class=\\"t-checkbox-group\\"><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><span>全选</span></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"optionA\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><span> 选项一(optionA/1) </span></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"optionB\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><span> 选项二(optionB/2) </span></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"optionC\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><span> 选项三(optionC/3) </span></span></label></div></div></div></div></div>"`;
exports[`ssr snapshot test > renders ./src/checkbox/_example/group.vue correctly 1`] = `"<div data-server-rendered=\\"true\\" class=\\"t-space t-space-vertical\\" style=\\"gap:48px;\\"><div class=\\"t-space-item\\"><div class=\\"t-space t-space-vertical\\" style=\\"gap:16px;\\"><div class=\\"t-space-item\\"><div>方式一:业务侧自定义全选功能。选中值: 选项一</div></div><div class=\\"t-space-item\\"><div><label tabindex=\\"0\\" class=\\"t-checkbox t-is-indeterminate\\"><input type=\\"checkbox\\" indeterminate=\\"indeterminate\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">全选</span></label></div></div><div class=\\"t-space-item\\"><div role=\\"group\\" aria-label=\\"checkbox-group\\" class=\\"t-checkbox-group\\"><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项一\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><div>选项一</div></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项二\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项二</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项三\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项三</span></label></div></div></div></div><div class=\\"t-space-item\\"><div class=\\"t-space t-space-vertical\\" style=\\"gap:16px;\\"><div class=\\"t-space-item\\"><div> 方式二:组件内置全选功能,使用插槽定义选项。⚠️注意:数据量大时,不建议使用这种方式。选中值: 选项一。 </div></div><div class=\\"t-space-item\\"><div role=\\"group\\" aria-label=\\"checkbox-group\\" class=\\"t-checkbox-group\\"><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">全选</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项一\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项一</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项二\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项二</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项三\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项三</span></label></div></div></div></div><div class=\\"t-space-item\\"><div class=\\"t-space t-space-vertical\\" style=\\"gap:16px;\\"><div class=\\"t-space-item\\"><div> 方式三:组件内置全选功能,使用 \`options\` 定义选项。数据量大时,可以避免所有元素重新渲染。选中值: 选项一, 选项二, 选项三 </div></div><div class=\\"t-space-item\\"><div role=\\"group\\" aria-label=\\"checkbox-group\\" class=\\"t-checkbox-group\\"><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">全选</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项一\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项一</span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项二\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><div>选项二</div></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"选项三\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\">选项三</span></label></div></div></div></div><div class=\\"t-space-item\\"><div class=\\"t-space t-space-vertical\\" style=\\"gap:16px;\\"><div class=\\"t-space-item\\"><div> 方式四:组件内置全选功能,\`options\` 定义选项列表,插槽定义选项内容。数据量大时,可以避免所有元素重新渲染。 </div></div><div class=\\"t-space-item\\"><div role=\\"group\\" aria-label=\\"checkbox-group\\" class=\\"t-checkbox-group\\"><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><span>全选</span></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"optionA\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><span> 选项一(optionA/1) </span></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"optionB\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><span> 选项二(optionB/2) </span></span></label><label tabindex=\\"0\\" class=\\"t-checkbox\\"><input type=\\"checkbox\\" tabindex=\\"-1\\" value=\\"optionC\\" class=\\"t-checkbox__former\\"><span class=\\"t-checkbox__input\\"></span><span class=\\"t-checkbox__label\\"><span> 选项三(optionC/3) </span></span></label></div></div></div></div></div>"`;

exports[`ssr snapshot test > renders ./src/checkbox/_example/link.vue correctly 1`] = `
"<div data-server-rendered=\\"true\\" class=\\"t-space t-space-vertical\\" style=\\"gap:24px;\\"><div class=\\"t-space-item\\"><div>选中值: [
Expand Down

0 comments on commit 5b418a9

Please sign in to comment.