Skip to content

Commit 7424a78

Browse files
authored
fix(components): [TreeSelect] checking node reset checked cache node (element-plus#12367)
* fix(components): [TreeSelect] checking node reset checked cache node * refactor: remove unused variables and duplicate `onCheck` event
1 parent cd30611 commit 7424a78

File tree

2 files changed

+89
-2
lines changed

2 files changed

+89
-2
lines changed

packages/components/tree-select/__tests__/tree-select.test.tsx

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -576,4 +576,71 @@ describe('TreeSelect.vue', () => {
576576
await nextTick()
577577
expect(onCheckChange).toHaveBeenLastCalledWith(1)
578578
})
579+
580+
test('checking node will not reset checked cache node', async () => {
581+
const modelValue = ref<number[]>([2])
582+
const cacheData = reactive([{ value: 2, label: '2-label' }])
583+
let id = 1
584+
const { tree } = createComponent({
585+
props: {
586+
modelValue,
587+
multiple: true,
588+
showCheckbox: true,
589+
checkStrictly: true,
590+
lazy: true,
591+
load: (node: object, resolve: (p: any) => any[]) => {
592+
resolve([{ value: id, label: `${id}-label`, isLeaf: false }])
593+
id++
594+
},
595+
cacheData,
596+
},
597+
})
598+
599+
await nextTick()
600+
601+
const node1 = tree.find('.el-tree-node__content')
602+
const node1Checkbox = node1.find('.el-checkbox__original')
603+
604+
expect(node1.text()).toBe('1-label')
605+
await node1Checkbox.trigger('click')
606+
607+
expect(modelValue.value).toEqual([1, 2])
608+
})
609+
610+
test('cached checked node can be canceled', async () => {
611+
const modelValue = ref<number[]>([2])
612+
const cacheData = reactive([{ value: 2, label: '2-label' }])
613+
let id = 1
614+
const { tree } = createComponent({
615+
props: {
616+
modelValue,
617+
multiple: true,
618+
showCheckbox: true,
619+
checkStrictly: true,
620+
lazy: true,
621+
load: (node: object, resolve: (p: any) => any[]) => {
622+
resolve([{ value: id, label: `${id}-label`, isLeaf: false }])
623+
id++
624+
},
625+
cacheData,
626+
},
627+
})
628+
629+
await nextTick()
630+
631+
const node1 = tree.find('.el-tree-node__content')
632+
await node1.trigger('click')
633+
await nextTick()
634+
635+
const node2 = tree.findAll('.el-tree-node__content')[1]
636+
expect(node2.text()).toBe('2-label')
637+
638+
const node2Checkbox = node2.find('.el-checkbox')
639+
expect(node2Checkbox.element.classList.contains('is-checked')).toBe(true)
640+
641+
await node2Checkbox.trigger('click')
642+
expect(node2Checkbox.element.classList.contains('is-checked')).toBe(false)
643+
644+
expect(modelValue.value).toEqual([])
645+
})
579646
})

packages/components/tree-select/src/tree.ts

Lines changed: 22 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -112,6 +112,13 @@ export const useTree = (
112112
return options
113113
})
114114

115+
const cacheOptionsMap = computed(() => {
116+
return cacheOptions.value.reduce(
117+
(prev, next) => ({ ...prev, [next.value]: next }),
118+
{}
119+
)
120+
})
121+
115122
return {
116123
...pick(toRefs(props), Object.keys(ElTree.props)),
117124
...attrs,
@@ -171,13 +178,26 @@ export const useTree = (
171178
},
172179
onCheck: (data, params) => {
173180
const dataValue = getNodeValByProp('value', data)
181+
182+
// fix: checkedKeys has not cached keys
183+
const uncachedCheckedKeys = params.checkedKeys
184+
const cachedKeys = props.multiple
185+
? toValidArray(props.modelValue).filter(
186+
(item) =>
187+
item in cacheOptionsMap.value &&
188+
!tree.value.getNode(item) &&
189+
!uncachedCheckedKeys.includes(item)
190+
)
191+
: []
192+
const checkedKeys = uncachedCheckedKeys.concat(cachedKeys)
193+
174194
if (props.checkStrictly) {
175195
emit(
176196
UPDATE_MODEL_EVENT,
177197
// Checking for changes may come from `check-on-node-click`
178198
props.multiple
179-
? params.checkedKeys
180-
: params.checkedKeys.includes(dataValue)
199+
? checkedKeys
200+
: checkedKeys.includes(dataValue)
181201
? dataValue
182202
: undefined
183203
)

0 commit comments

Comments
 (0)