Skip to content

Commit bf79f33

Browse files
authored
fix(cascader): 修复三级懒加载问题 (#1872)
* fix(cascader): 修复三级懒加载问题 * chore: update lazy demo * fix: 防止pick触发两次
1 parent de459a6 commit bf79f33

File tree

2 files changed

+45
-24
lines changed

2 files changed

+45
-24
lines changed

src/cascader/cascader.tsx

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -148,19 +148,22 @@ export default defineComponent({
148148
}
149149
};
150150

151-
const handleSelect = (value: RadioValue, level: number) => {
151+
const handleSelect = (value: RadioValue, level: number, emitPick = true) => {
152152
const keys = props.keys as KeysType;
153153
const index = items[level].findIndex((item: any) => lodashGet(item, keys?.value ?? 'value') === value);
154154
const item = items[level][index];
155155
if (lodashGet(item, keys?.disabled ?? 'disabled')) {
156156
return;
157157
}
158-
props.onPick?.({
159-
value: lodashGet(item, keys?.value ?? 'value'),
160-
label: lodashGet(item, keys?.label ?? 'label'),
161-
level,
162-
index,
163-
});
158+
159+
if (emitPick) {
160+
props.onPick?.({
161+
value: lodashGet(item, keys?.value ?? 'value'),
162+
label: lodashGet(item, keys?.label ?? 'label'),
163+
level,
164+
index,
165+
});
166+
}
164167

165168
if (props.checkStrictly && selectedValue.includes(String(value))) {
166169
cancelSelect(value, level, index, item);
@@ -223,10 +226,10 @@ export default defineComponent({
223226
watch(
224227
() => props.options,
225228
() => {
226-
items.splice(0, items.length, ...[props.options ?? []]);
229+
initWithValue();
227230

228231
if (open.value) {
229-
handleSelect(childrenInfo.value, childrenInfo.level);
232+
handleSelect(childrenInfo.value, childrenInfo.level, false);
230233
}
231234
},
232235
{

src/cascader/demos/lazy.vue

Lines changed: 33 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,8 @@ const note = ref('请选择地址');
3030
3131
const onPick = (value: string) => {
3232
const values = JSON.parse(JSON.stringify(value));
33-
if (
34-
options.value[values.index] &&
35-
values.value === options.value[values.index].value &&
36-
options.value[values.index].children?.length === 0
37-
) {
33+
console.log('onPick', values);
34+
const showToast = () => {
3835
Toast({
3936
theme: 'loading',
4037
message: '加载中...',
@@ -43,25 +40,46 @@ const onPick = (value: string) => {
4340
duration: 10000,
4441
preventScrollThrough: true,
4542
});
43+
};
44+
45+
if (values.level === 1 && data.value[0].children[values.index]?.children?.length === 0) {
46+
showToast();
47+
setTimeout(() => {
48+
const current = data.value[0].children[values.index];
49+
current.children = [{ value: `${current.value}01`, label: `${current.label}街道` }];
50+
Toast.clear();
51+
}, 1000);
52+
return;
53+
}
54+
55+
if (
56+
options.value[values.index] &&
57+
values.value === options.value[values.index].value &&
58+
options.value[values.index].children?.length === 0
59+
) {
60+
showToast();
4661
// 模拟数据请求
4762
setTimeout(() => {
4863
data.value[0].children = [
49-
{ value: '440304', label: '福田区' },
50-
{ value: '440303', label: '罗湖区' },
51-
{ value: '440305', label: '南山区' },
52-
{ value: '440306', label: '宝安区' },
53-
{ value: '440307', label: '龙岗区' },
54-
{ value: '440308', label: '盐田区' },
55-
{ value: '440309', label: '龙华区' },
56-
{ value: '440310', label: '坪山区' },
57-
{ value: '440311', label: '光明区' },
64+
{ value: '440304', label: '福田区', children: [] },
65+
{ value: '440303', label: '罗湖区', children: [] },
66+
{ value: '440305', label: '南山区', children: [] },
67+
{ value: '440306', label: '宝安区', children: [] },
68+
{ value: '440307', label: '龙岗区', children: [] },
69+
{ value: '440308', label: '盐田区', children: [] },
70+
{ value: '440309', label: '龙华区', children: [] },
71+
{ value: '440310', label: '坪山区', children: [] },
72+
{ value: '440311', label: '光明区', children: [] },
5873
];
5974
Toast.clear();
6075
}, 1000);
6176
}
6277
};
6378
const onChange = (value: string, options: any) => {
64-
note.value = options?.map((item: any) => item.label).join('/');
79+
note.value = options
80+
?.filter((item?: Array<{ label: string }>) => item)
81+
?.map((item: any) => item.label)
82+
.join('/');
6583
visible.value = false;
6684
};
6785

0 commit comments

Comments
 (0)