Skip to content

Commit 8e38ed8

Browse files
committed
refactor: tree-select
1 parent 8bf14f4 commit 8e38ed8

File tree

10 files changed

+43
-21
lines changed

10 files changed

+43
-21
lines changed

components/tree-select/index.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -70,6 +70,7 @@ const TreeSelect = defineComponent({
7070
}),
7171
slots: [
7272
'title',
73+
'titleRender',
7374
'placeholder',
7475
'maxTagPlaceholder',
7576
'treeIcon',

components/tree/DirectoryTree.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ export default defineComponent({
4242
showIcon: true,
4343
expandAction: 'click',
4444
}),
45-
slots: ['icon', 'title', 'switcherIcon'],
45+
slots: ['icon', 'title', 'switcherIcon', 'titleRender'],
4646
emits: [
4747
'update:selectedKeys',
4848
'update:checkedKeys',

components/tree/Tree.tsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -141,7 +141,7 @@ export default defineComponent({
141141
showIcon: false,
142142
blockNode: false,
143143
}),
144-
slots: ['icon', 'title', 'switcherIcon'],
144+
slots: ['icon', 'title', 'switcherIcon', 'titleRender'],
145145
emits: [
146146
'update:selectedKeys',
147147
'update:checkedKeys',

components/vc-select/Selector/SingleSelector.tsx

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import pickAttrs from '../../_util/pickAttrs';
22
import Input from './Input';
33
import type { InnerSelectorProps } from './interface';
4-
import type { VNodeChild } from 'vue';
4+
import { Fragment, Suspense, VNodeChild } from 'vue';
55
import { computed, defineComponent, ref, watch } from 'vue';
66
import PropTypes from '../../_util/vue-types';
77
import { useInjectTreeSelectContext } from 'ant-design-vue/es/vc-tree-select/Context';
@@ -96,11 +96,21 @@ const SingleSelector = defineComponent<SelectorProps>({
9696
onInputCompositionEnd,
9797
} = props;
9898
const item = values[0];
99-
let slotTitle = null;
100-
if (treeSelectContext.value.slots) {
101-
slotTitle =
99+
let titleNode = null;
100+
// custom tree-select title by slot
101+
if (item && treeSelectContext.value.slots) {
102+
titleNode =
103+
item.label ||
102104
treeSelectContext.value.slots[item?.option?.data?.slots?.title] ||
103105
treeSelectContext.value.slots.title;
106+
if (typeof titleNode === 'function') {
107+
titleNode = titleNode(item.option?.data || {});
108+
} else if (treeSelectContext.value.slots.titleRender) {
109+
// 因历史 title 是覆盖逻辑,新增 titleRender,所有的 title 都走一遍 titleRender
110+
titleNode = treeSelectContext.value.slots.titleRender(item.option?.data || {});
111+
}
112+
} else {
113+
titleNode = item?.label;
104114
}
105115
return (
106116
<>
@@ -134,8 +144,7 @@ const SingleSelector = defineComponent<SelectorProps>({
134144
{/* Display value */}
135145
{!combobox.value && item && !hasTextInput.value && (
136146
<span class={`${prefixCls}-selection-item`} title={title.value}>
137-
{/* <Fragment key={item.key || item.value}>{item.label}</Fragment> */}
138-
{slotTitle?.(item.option?.data) || item.label}
147+
<Fragment key={item.key || item.value}>{titleNode}</Fragment>
139148
</span>
140149
)}
141150

components/vc-tree-select/Context.tsx

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,10 @@
1-
import type { FlattenDataNode, Key, LegacyDataNode, RawValueType } from './interface';
1+
import type {
2+
FlattenDataNode,
3+
InternalDataEntity,
4+
Key,
5+
LegacyDataNode,
6+
RawValueType,
7+
} from './interface';
28
import type { SkipType } from './hooks/useKeyValueMapping';
39
import type { ComputedRef, InjectionKey, PropType } from 'vue';
410
import { computed, defineComponent, inject, provide } from 'vue';
@@ -31,7 +37,11 @@ interface ContextProps {
3137
ignoreDisabledCheck?: boolean,
3238
) => FlattenDataNode;
3339

34-
slots: Record<string, any>;
40+
slots: {
41+
title?: (data: InternalDataEntity) => any;
42+
titleRender?: (data: InternalDataEntity) => any;
43+
[key: string]: (d: any) => any | undefined;
44+
};
3545
}
3646

3747
const SelectContextKey: InjectionKey<ComputedRef<ContextProps>> = Symbol('SelectContextKey');

components/vc-tree/Tree.tsx

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ import classNames from '../_util/classNames';
3434
export default defineComponent({
3535
name: 'Tree',
3636
inheritAttrs: false,
37-
slots: ['checkable', 'title', 'icon'],
37+
slots: ['checkable', 'title', 'icon', 'titleRender'],
3838
props: initDefaultProps(treeProps(), {
3939
prefixCls: 'vc-tree',
4040
showLine: false,
@@ -1023,8 +1023,6 @@ export default defineComponent({
10231023
loadData,
10241024
filterTreeNode,
10251025

1026-
titleRender: slots.title,
1027-
10281026
onNodeClick,
10291027
onNodeDoubleClick,
10301028
onNodeExpand,

components/vc-tree/TreeNode.tsx

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -362,7 +362,7 @@ export default defineComponent({
362362
icon: treeIcon,
363363
draggable,
364364
loadData,
365-
titleRender,
365+
slots: contextSlots,
366366
} = context.value;
367367
const disabled = isDisabled.value;
368368
const mergedDraggable = typeof draggable === 'function' ? draggable(data) : draggable;
@@ -390,11 +390,12 @@ export default defineComponent({
390390
let titleNode: any;
391391
if (typeof title === 'function') {
392392
titleNode = title(data);
393-
} else if (titleRender) {
394-
titleNode = titleRender(data);
393+
} else if (contextSlots.titleRender) {
394+
titleNode = contextSlots.titleRender(data);
395395
} else {
396-
titleNode = title === undefined ? defaultTitle : title;
396+
titleNode = title;
397397
}
398+
titleNode = titleNode === undefined ? defaultTitle : titleNode;
398399

399400
const $title = <span class={`${prefixCls}-title`}>{titleNode}</span>;
400401

components/vc-tree/contextTypes.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ export interface TreeContextProps {
6464

6565
loadData: (treeNode: EventDataNode) => Promise<void>;
6666
filterTreeNode: (treeNode: EventDataNode) => boolean;
67-
titleRender?: (node: DataNode) => VueNode;
6867

6968
onNodeClick: NodeMouseEventHandler;
7069
onNodeDoubleClick: NodeMouseEventHandler;
@@ -81,7 +80,11 @@ export interface TreeContextProps {
8180
onNodeDragLeave: NodeDragEventHandler;
8281
onNodeDragEnd: NodeDragEventHandler;
8382
onNodeDrop: NodeDragEventHandler;
84-
slots: Record<string, any>;
83+
slots: {
84+
title?: (data: DataNode) => any;
85+
titleRender?: (data: DataNode) => any;
86+
[key: string]: (d: any) => any | undefined;
87+
};
8588
}
8689
const TreeContextKey: InjectionKey<ComputedRef<TreeContextProps>> = Symbol('TreeContextKey');
8790

components/vc-tree/props.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ export const treeProps = () => ({
132132
defaultSelectedKeys: { type: Array as PropType<Key[]> },
133133
selectedKeys: { type: Array as PropType<Key[]> },
134134
allowDrop: { type: Function as PropType<AllowDrop> },
135-
// titleRender: { type: Function as PropType<(node: DataNode) => any> },
135+
136136
dropIndicatorRender: {
137137
type: Function as PropType<
138138
(props: {

examples/App.vue

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
placeholder="Please select"
88
tree-default-expand-all
99
>
10-
<template #title1="{ key, value }">
10+
<template #title="{ key, value }">
1111
<span v-if="key === '0-0-1'" style="color: #08c">Child Node1 {{ value }}</span>
1212
</template>
1313
</a-tree-select>

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