diff --git a/package.json b/package.json index f001e8eb3..29dfa0888 100644 --- a/package.json +++ b/package.json @@ -13,6 +13,7 @@ "url": "https://github.com/tencent/tdesign-mobile-vue" }, "scripts": { + "init": "git submodule init && git submodule update", "start": "npm run dev", "prepare": "husky install .husky", "dev": "cd site && cross-env NODE_ENV=development vite", @@ -187,4 +188,4 @@ "prettier --write" ] } -} +} \ No newline at end of file diff --git a/src/cascader/__test__/__snapshots__/demo.test.jsx.snap b/src/cascader/__test__/__snapshots__/demo.test.jsx.snap index fc3876842..53abab2ae 100644 --- a/src/cascader/__test__/__snapshots__/demo.test.jsx.snap +++ b/src/cascader/__test__/__snapshots__/demo.test.jsx.snap @@ -460,6 +460,202 @@ exports[`Cascader > Cascader keysVue demo works fine 1`] = ` `; +exports[`Cascader > Cascader lazyVue demo works fine 1`] = ` +
+ +
+
+ + +
+
+ 地址 + + +
+
+ 请选择地址 +
+
+
+ + + +
+
+
+ + + +
+
+ +

+ 异步加载 +

+
+
+ + +
+
+ + +
+
+ 地址 + + +
+
+ 请选择地址 +
+
+
+ + + +
+
+
+ + +
diff --git a/src/cascader/__test__/demo.test.jsx b/src/cascader/__test__/demo.test.jsx index f51aa4c9b..c9f019384 100644 --- a/src/cascader/__test__/demo.test.jsx +++ b/src/cascader/__test__/demo.test.jsx @@ -5,6 +5,7 @@ import { mount } from '@vue/test-utils'; import baseVue from '@/cascader/demos/base.vue'; import keysVue from '@/cascader/demos/keys.vue'; +import lazyVue from '@/cascader/demos/lazy.vue'; import mobileVue from '@/cascader/demos/mobile.vue'; import themeTabVue from '@/cascader/demos/theme-tab.vue'; import withTitleVue from '@/cascader/demos/with-title.vue'; @@ -13,6 +14,7 @@ import withValueVue from '@/cascader/demos/with-value.vue'; const mapper = { baseVue, keysVue, + lazyVue, mobileVue, themeTabVue, withTitleVue, diff --git a/src/cascader/cascader.vue b/src/cascader/cascader.vue index 953808c08..17546a576 100644 --- a/src/cascader/cascader.vue +++ b/src/cascader/cascader.vue @@ -82,6 +82,7 @@ import { watch, onMounted, Ref, + nextTick, } from 'vue'; import TPopup from '../popup'; import { Tabs as TTabs, TabPanel as TTabPanel } from '../tabs'; @@ -95,6 +96,16 @@ const { prefix } = config; const name = `${prefix}-cascader`; const defaultOptionLabel = '选择选项'; +interface ChildrenInfoType { + value: string | number; + level: number; +} + +const childrenInfo: ChildrenInfoType = { + value: '', + level: 0, +}; + interface KeysType { value?: string; label?: string; @@ -200,6 +211,9 @@ export default defineComponent({ stepIndex.value += 1; steps[level + 1] = '选择选项'; steps.length = level + 2; + } else if (item[(keys as Ref).value?.children ?? 'children']?.length === 0) { + childrenInfo.value = e; + childrenInfo.level = level; } else { setCascaderValue(item[keys.value?.value ?? 'value']); props.onChange?.( @@ -218,6 +232,18 @@ export default defineComponent({ open.value = visible.value; }); + watch( + () => props.options, + () => { + if (open.value) { + handleSelect(childrenInfo.value, childrenInfo.level); + } + }, + { + deep: true, + }, + ); + const close = (trigger: string) => { props.onClose?.({ trigger }); }; diff --git a/src/cascader/demos/lazy.vue b/src/cascader/demos/lazy.vue new file mode 100644 index 000000000..0eb41e28a --- /dev/null +++ b/src/cascader/demos/lazy.vue @@ -0,0 +1,71 @@ + + + diff --git a/src/cascader/demos/mobile.vue b/src/cascader/demos/mobile.vue index 9ae5bb99a..29f2258fd 100644 --- a/src/cascader/demos/mobile.vue +++ b/src/cascader/demos/mobile.vue @@ -17,6 +17,9 @@ + + +