Skip to content

Commit e0a5e7d

Browse files
committed
feat: support labelRender prop
1 parent 6fa2d68 commit e0a5e7d

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

src/TreeSelect.tsx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,7 @@ export interface TreeSelectProps<ValueType = any, OptionType extends DataNode =
9494
listItemScrollOffset?: number;
9595
onPopupVisibleChange?: (open: boolean) => void;
9696
treeTitleRender?: (node: OptionType) => React.ReactNode;
97+
labelRender?: (props: LabeledValueType) => React.ReactNode;
9798

9899
// >>> Tree
99100
treeLine?: boolean;
@@ -161,6 +162,7 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
161162
listHeight = 200,
162163
listItemHeight = 20,
163164
listItemScrollOffset = 0,
165+
labelRender,
164166

165167
onPopupVisibleChange,
166168
popupMatchSelectWidth = true,
@@ -395,7 +397,7 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
395397

396398
return rawDisplayValues.map(item => ({
397399
...item,
398-
label: item.label ?? item.value,
400+
label: (typeof labelRender === 'function' ? labelRender(item) : item.label) ?? item.value,
399401
}));
400402
// eslint-disable-next-line react-hooks/exhaustive-deps
401403
}, [
@@ -406,6 +408,7 @@ const TreeSelect = React.forwardRef<BaseSelectRef, TreeSelectProps>((props, ref)
406408
convert2LabelValues,
407409
mergedShowCheckedStrategy,
408410
keyEntities,
411+
labelRender,
409412
]);
410413

411414
const [cachedDisplayValues] = useCache(displayValues);

tests/Select.spec.tsx

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -705,4 +705,45 @@ describe('TreeSelect.basic', () => {
705705
expect(itemTitle).toHaveStyle(customStyles.itemTitle);
706706
expect(item).toHaveStyle(customStyles.item);
707707
});
708+
709+
it('labelRender', () => {
710+
const onLabelRender = jest.fn();
711+
const labelRender = props => {
712+
const { label, value } = props;
713+
onLabelRender();
714+
return `${label}-${value}`;
715+
};
716+
const { container } = render(
717+
<TreeSelect
718+
treeData={[{ label: 'realLabel', value: 'a' }]}
719+
value="a"
720+
labelRender={labelRender}
721+
/>,
722+
);
723+
724+
expect(onLabelRender).toHaveBeenCalled();
725+
expect(container.querySelector('.rc-tree-select-selector').textContent).toEqual('realLabel-a');
726+
});
727+
728+
it('labelRender when value is not in treeData', () => {
729+
const onLabelRender = jest.fn();
730+
const treeData = [{ label: 'realLabel', value: 'b' }];
731+
const labelRender = props => {
732+
const { label, value } = props;
733+
// current value is in treeData
734+
if (treeData.find(item => item.value === value)) {
735+
return label;
736+
} else {
737+
// current value is not in treeData
738+
onLabelRender();
739+
return `${label || 'fakeLabel'}-${value}`;
740+
}
741+
};
742+
const { container } = render(
743+
<TreeSelect value="a" labelRender={labelRender} treeData={treeData} />,
744+
);
745+
746+
expect(onLabelRender).toHaveBeenCalled();
747+
expect(container.querySelector('.rc-tree-select-selector').textContent).toEqual('fakeLabel-a');
748+
});
708749
});

0 commit comments

Comments
 (0)