Skip to content

Commit 14710b7

Browse files
jevin98sleeprite
authored andcommitted
!451 feat(cascader): 新增 selectLabel 方法
* feat(cascader): add defineExpose selectLabel
1 parent 30e968d commit 14710b7

File tree

3 files changed

+111
-23
lines changed

3 files changed

+111
-23
lines changed

docs/src/document/zh-CN/components/cascader.md

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1166,6 +1166,17 @@ const options3=[
11661166

11671167
:::
11681168

1169+
::: title Cascader 方法
1170+
:::
1171+
1172+
::: table
1173+
1174+
| 属性 | 描述 | 属性类型 | 版本 |
1175+
| ---- | -------------- |--------|-------|
1176+
| selectLabel | 选中值对应的文本 | `ComputedRef<string \| string[]>` | `2.19.4` |
1177+
1178+
:::
1179+
11691180
::: title CascaderPanel 属性
11701181
:::
11711182

packages/component/component/cascader/__tests__/cascader.test.tsx

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -185,4 +185,81 @@ describe("LayCascader", () => {
185185

186186
expect((component.vm as any)._context.flatData.value.length).toBe(3);
187187
});
188+
189+
test("expose selectLabel", async () => {
190+
const wrapper = mount({
191+
setup() {
192+
const modelValue = ref("1/1-1/1-1-1");
193+
const options = [
194+
{
195+
label: "label1",
196+
value: "1",
197+
children: [
198+
{
199+
label: "label1-1",
200+
value: "1-1",
201+
children: [{ label: "label1-1-1", value: "1-1-1" }],
202+
},
203+
],
204+
},
205+
{ label: "label2", value: "2" },
206+
{ label: "label3", value: "3" },
207+
];
208+
209+
return () => (
210+
<LayCascader
211+
ref="cascaderRef"
212+
options={options}
213+
v-model={modelValue.value}
214+
></LayCascader>
215+
);
216+
},
217+
});
218+
219+
await nextTick();
220+
221+
const component = wrapper.findComponent(LayCascader);
222+
223+
expect(component.vm.selectLabel).toBe("label1 / label1-1 / label1-1-1");
224+
});
225+
226+
test("expose selectLabel multiple", async () => {
227+
const wrapper = mount({
228+
setup() {
229+
const modelValue = ref(["1-1-1", "2"]);
230+
const options = [
231+
{
232+
label: "label1",
233+
value: "1",
234+
children: [
235+
{
236+
label: "label1-1",
237+
value: "1-1",
238+
children: [{ label: "label1-1-1", value: "1-1-1" }],
239+
},
240+
],
241+
},
242+
{ label: "label2", value: "2" },
243+
{ label: "label3", value: "3" },
244+
];
245+
246+
return () => (
247+
<LayCascader
248+
ref="cascaderRef"
249+
options={options}
250+
v-model={modelValue.value}
251+
multiple
252+
></LayCascader>
253+
);
254+
},
255+
});
256+
257+
const component = wrapper.findComponent(LayCascader);
258+
259+
await nextTick();
260+
expect(component.vm.selectLabel).toEqual([
261+
"label1/label1-1/label1-1-1",
262+
"label2",
263+
]);
264+
});
188265
});

packages/component/component/cascader/index.vue

Lines changed: 23 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -189,7 +189,6 @@ const openState = ref(false);
189189
const _isSearching = ref(false);
190190
const _searchValue = ref("");
191191
const _matchedList: Ref<Array<CascaderPanelItemPropsInternal>> = ref([]);
192-
const _innerProcess = computed(() => _context);
193192
const _dataSource = ref(props.options);
194193
const _multiple = ref(props.multiple);
195194
const _decollator = ref(props.decollator);
@@ -201,11 +200,8 @@ const _replaceFields = ref({
201200
value: props.replaceFields?.value ?? "value",
202201
children: props.replaceFields?.children ?? "children",
203202
});
204-
const _selectKeys = ref<Array<string>>(_innerProcess.value.selectKeys.value);
205-
const _displayValue = computed({
206-
get: () => _innerProcess.value.selectLabel.value,
207-
set: (v) => {},
208-
});
203+
const _selectKeys = ref<Array<string>>(_context.selectKeys.value);
204+
const _displayValue = computed(() => _context.selectLabel.value);
209205
const _changeOnSelect = ref(props.changeOnSelect);
210206
/**
211207
* 执行搜索
@@ -214,21 +210,21 @@ const _changeOnSelect = ref(props.changeOnSelect);
214210
const doSearchValue = (str: string) =>
215211
(props.search &&
216212
props.searchMethod &&
217-
_innerProcess.value.sanitizer(props.searchMethod(str), undefined)) ||
218-
_innerProcess.value.flatData.value.filter(
219-
(a: CascaderPanelItemPropsInternal) => a.label.includes(str)
213+
_context.sanitizer(props.searchMethod(str), undefined)) ||
214+
_context.flatData.value.filter((a: CascaderPanelItemPropsInternal) =>
215+
a.label.includes(str)
220216
);
221217
222218
/**
223219
* 清空内容
224220
*/
225221
const onClear = () => {
226-
_innerProcess.value.multipleSelectItem.value.forEach(
222+
_context.multipleSelectItem.value.forEach(
227223
(a) => (a.checked = a.indeterminate = false)
228224
);
229-
_innerProcess.value.buildMultipleStatus();
230-
_innerProcess.value.multipleSelectItem.value.clear();
231-
_innerProcess.value.selectKeys.value = [];
225+
_context.buildMultipleStatus();
226+
_context.multipleSelectItem.value.clear();
227+
_context.selectKeys.value = [];
232228
_selectKeys.value = [];
233229
emit("update:modelValue", _multiple.value ? [] : undefined);
234230
emit("clear");
@@ -241,19 +237,19 @@ const onRemove = (value: string, e: KeyboardEvent) => {
241237
let _k = value.split(_decollator.value);
242238
const k = _k.shift();
243239
let obj: CascaderPanelItemPropsInternal | undefined =
244-
_innerProcess.value.flatData.value.find((a) => a.label === k);
240+
_context.flatData.value.find((a) => a.label === k);
245241
while (obj && _k.length) {
246242
const k = _k.shift();
247243
obj = obj.children?.find((a) => a.label === k);
248244
}
249245
if (obj !== undefined)
250-
_innerProcess.value.selectKeys.value.splice(
251-
_innerProcess.value.selectKeys.value.findIndex((a) => a === obj!.value),
246+
_context.selectKeys.value.splice(
247+
_context.selectKeys.value.findIndex((a) => a === obj!.value),
252248
1
253249
);
254250
obj!.checked = obj!.indeterminate = false;
255-
_innerProcess.value.multipleSelectItem.value.delete(obj!.value);
256-
_innerProcess.value.buildMultipleStatus();
251+
_context.multipleSelectItem.value.delete(obj!.value);
252+
_context.buildMultipleStatus();
257253
_selectKeys.value = [..._selectKeys.value.filter((v) => v !== obj!.value)];
258254
emit("update:modelValue", _selectKeys.value);
259255
dropdownRef.value.hide();
@@ -263,7 +259,7 @@ const onRemove = (value: string, e: KeyboardEvent) => {
263259
* @param selectKeys 选中的keys
264260
*/
265261
const _updateValue = (selectKeys: string[] | string) => {
266-
_innerProcess.value.selectKeys.value =
262+
_context.selectKeys.value =
267263
typeof selectKeys === "string"
268264
? selectKeys.split(props.decollator)
269265
: selectKeys;
@@ -381,10 +377,10 @@ watch(
381377
if (!val) {
382378
// 在这里手工更新内部状态
383379
if (!_multiple.value && props.search) {
384-
_innerProcess.value.selectKeys.value = [];
380+
_context.selectKeys.value = [];
385381
nextTick(() => {
386-
_innerProcess.value.selectKeys.value =
387-
_innerProcess.value.showKeys.value = _selectKeys.value;
382+
_context.selectKeys.value = _context.showKeys.value =
383+
_selectKeys.value;
388384
});
389385
}
390386
_isSearching.value = false;
@@ -398,7 +394,11 @@ watch(
398394
watch(
399395
() => props.modelValue,
400396
() => {
401-
_innerProcess.value.modelValue.value = props.modelValue;
397+
_context.modelValue.value = props.modelValue;
402398
}
403399
);
400+
401+
defineExpose({
402+
selectLabel: _context.selectLabel,
403+
});
404404
</script>

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy