Skip to content

Commit 5f5be87

Browse files
authored
feat: support titleRender (#447)
* ✨ feat: support titleRender * 🐳 chore: update test case * 🐳 chore: update prop name * 🐳 chore: update `label` logic * 🌈 style: format
1 parent e4d0bfa commit 5f5be87

File tree

5 files changed

+48
-6
lines changed

5 files changed

+48
-6
lines changed

β€Žexamples/basic.tsxβ€Ž

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
import '../assets/index.less';
2-
import React from 'react';
3-
import 'rc-dialog/assets/index.css';
41
import Dialog from 'rc-dialog';
5-
import TreeSelect, { TreeNode, SHOW_PARENT } from '../src';
2+
import 'rc-dialog/assets/index.css';
3+
import React from 'react';
4+
import '../assets/index.less';
5+
import TreeSelect, { SHOW_PARENT, TreeNode } from '../src';
66
import { gData } from './utils/dataUtil';
77

88
function isLeaf(value) {
@@ -381,6 +381,14 @@ class Demo extends React.Component {
381381
</TreeNode>
382382
<TreeNode value="same value3" title="same title" key="0-3" />
383383
</TreeSelect>
384+
385+
<h2>title render</h2>
386+
<TreeSelect<{ label: string }>
387+
open
388+
style={{ width: 300 }}
389+
treeData={gData}
390+
treeTitleRender={node => node.label + 'ok'}
391+
/>
384392
</div>
385393
);
386394
}

β€Žsrc/OptionList.tsxβ€Ž

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ const OptionList: React.RefForwardingComponent<ReviseRefOptionListProps> = (_, r
4343
onSelect,
4444
dropdownMatchSelectWidth,
4545
treeExpandAction,
46+
treeTitleRender,
4647
} = React.useContext(TreeSelectContext);
4748

4849
const {
@@ -241,6 +242,7 @@ const OptionList: React.RefForwardingComponent<ReviseRefOptionListProps> = (_, r
241242
checkedKeys={mergedCheckedKeys}
242243
selectedKeys={!checkable ? checkedKeys : []}
243244
defaultExpandAll={treeDefaultExpandAll}
245+
titleRender={treeTitleRender}
244246
{...treeProps}
245247
// Proxy event out
246248
onActiveChange={setActiveKey}

β€Žsrc/TreeSelect.tsxβ€Ž

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,7 @@ export interface TreeSelectProps<
161161
listItemHeight?: number;
162162
listItemScrollOffset?: number;
163163
onDropdownVisibleChange?: (open: boolean) => void;
164+
treeTitleRender?: (node: ValueType) => React.ReactNode;
164165

165166
// >>> Tree
166167
treeLine?: boolean;
@@ -237,6 +238,7 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
237238
showTreeIcon,
238239
switcherIcon,
239240
treeMotion,
241+
treeTitleRender,
240242

241243
...restProps
242244
} = props;
@@ -438,9 +440,16 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
438440
// Back fill with origin label
439441
const labeledValues = values.map(val => {
440442
const targetItem = rawLabeledValues.find(item => item.value === val);
443+
let label;
444+
// Ensure that when labelInValue is true, if label is undefined, it remains undefined.
445+
if (labelInValue && targetItem.label !== undefined) {
446+
label = targetItem.label;
447+
} else if (!labelInValue && treeTitleRender) {
448+
label = treeTitleRender(targetItem);
449+
}
441450
return {
442451
value: val,
443-
label: targetItem?.label,
452+
label,
444453
};
445454
});
446455

@@ -671,6 +680,7 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
671680
fieldNames: mergedFieldNames,
672681
onSelect: onOptionSelect,
673682
treeExpandAction,
683+
treeTitleRender,
674684
}),
675685
[
676686
virtual,
@@ -682,6 +692,7 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
682692
mergedFieldNames,
683693
onOptionSelect,
684694
treeExpandAction,
695+
treeTitleRender,
685696
],
686697
);
687698

β€Žsrc/TreeSelectContext.tsβ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ export interface TreeSelectContextProps {
1212
fieldNames: InternalFieldName;
1313
onSelect: OnInternalSelect;
1414
treeExpandAction?: ExpandAction;
15+
treeTitleRender?: (node: any) => React.ReactNode;
1516
}
1617

1718
const TreeSelectContext = React.createContext<TreeSelectContextProps>(null as any);

β€Žtests/Select.props.spec.jsβ€Ž

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
/* eslint-disable no-undef, react/no-multi-comp, no-console */
2-
import React from 'react';
32
import { mount } from 'enzyme';
43
import Tree, { TreeNode } from 'rc-tree';
4+
import React from 'react';
55
import TreeSelect, { SHOW_ALL, SHOW_CHILD, SHOW_PARENT, TreeNode as SelectNode } from '../src';
66

77
// Promisify timeout to let jest catch works
@@ -612,5 +612,25 @@ describe('TreeSelect.props', () => {
612612
});
613613
});
614614
});
615+
616+
describe('title render', () => {
617+
const treeData = [
618+
{ label: 'Label 0-0', value: 'Value 0-0', key: 'key 0-0' },
619+
{ label: 'Label 0-1', value: 'Value 0-1', key: 'key 0-1' },
620+
{ label: 'Label 1-0', value: 'Value 1-0', key: 'key 1-0' },
621+
];
622+
it('basic', () => {
623+
const wrapper = mount(
624+
<div>
625+
<TreeSelect
626+
defaultValue={'Value 0-0'}
627+
treeTitleRender={node => node.value}
628+
treeData={treeData}
629+
/>
630+
</div>,
631+
);
632+
expect(wrapper.getSelection(0).text()).toBe('Value 0-0');
633+
});
634+
});
615635
});
616636
});

0 commit comments

Comments
Β (0)