Skip to content

Commit c7a7478

Browse files
authored
feat: dropdown-render prop (#88)
* feat: dropdown-render prop * chore: lint warnings
1 parent 8bb4d93 commit c7a7478

File tree

4 files changed

+594
-6
lines changed

4 files changed

+594
-6
lines changed

examples/dropdown-render.js

Lines changed: 91 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,91 @@
1+
/* eslint-disable no-console */
2+
import React from 'react';
3+
import '../assets/index.less';
4+
import Cascader from '../src';
5+
6+
const addressOptions = [
7+
{
8+
label: '福建',
9+
value: 'fj',
10+
children: [
11+
{
12+
label: '福州',
13+
value: 'fuzhou',
14+
children: [
15+
{
16+
label: '马尾',
17+
value: 'mawei',
18+
},
19+
],
20+
},
21+
{
22+
label: '泉州',
23+
value: 'quanzhou',
24+
},
25+
],
26+
},
27+
{
28+
label: '浙江',
29+
value: 'zj',
30+
children: [
31+
{
32+
label: '杭州',
33+
value: 'hangzhou',
34+
children: [
35+
{
36+
label: '余杭',
37+
value: 'yuhang',
38+
},
39+
],
40+
},
41+
],
42+
},
43+
{
44+
label: '北京',
45+
value: 'bj',
46+
children: [
47+
{
48+
label: '朝阳区',
49+
value: 'chaoyang',
50+
},
51+
{
52+
label: '海淀区',
53+
value: 'haidian',
54+
disabled: true,
55+
},
56+
],
57+
},
58+
];
59+
60+
class Demo extends React.Component {
61+
state = {
62+
inputValue: '',
63+
};
64+
65+
onChange = (value, selectedOptions) => {
66+
console.log(value, selectedOptions);
67+
this.setState({
68+
inputValue: selectedOptions.map(o => o.label).join(', '),
69+
});
70+
};
71+
72+
render() {
73+
return (
74+
<Cascader
75+
options={addressOptions}
76+
onChange={this.onChange}
77+
dropdownRender={menus => (
78+
<div>
79+
{menus}
80+
<hr />
81+
Hey, DropdownRender, Long DropdownRender, Long DropdownRender
82+
</div>
83+
)}
84+
>
85+
<input placeholder="please select address" value={this.state.inputValue} />
86+
</Cascader>
87+
);
88+
}
89+
}
90+
91+
export default Demo;

src/Cascader.tsx

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@ export interface CascaderProps extends Pick<TriggerProps, 'getPopupContainer'> {
3838
popupPlacement?: string;
3939
prefixCls?: string;
4040
dropdownMenuColumnStyle?: React.CSSProperties;
41+
dropdownRender?: (menu: React.ReactElement) => React.ReactElement;
4142
builtinPlacements?: BuildInPlacements;
4243
loadData?: (selectOptions: CascaderOption[]) => void;
4344
changeOnSelect?: boolean;
@@ -351,6 +352,7 @@ class Cascader extends React.Component<CascaderProps, CascaderState> {
351352
builtinPlacements,
352353
popupPlacement,
353354
children,
355+
dropdownRender,
354356
...restProps
355357
} = this.props;
356358
// Did not show popup when there is no options
@@ -371,6 +373,10 @@ class Cascader extends React.Component<CascaderProps, CascaderState> {
371373
} else {
372374
emptyMenuClassName = ` ${prefixCls}-menus-empty`;
373375
}
376+
let popupNode = menus;
377+
if (dropdownRender) {
378+
popupNode = dropdownRender(menus);
379+
}
374380
return (
375381
<Trigger
376382
ref={this.saveTrigger}
@@ -383,7 +389,7 @@ class Cascader extends React.Component<CascaderProps, CascaderState> {
383389
onPopupVisibleChange={this.handlePopupVisibleChange}
384390
prefixCls={`${prefixCls}-menus`}
385391
popupClassName={popupClassName + emptyMenuClassName}
386-
popup={menus}
392+
popup={popupNode}
387393
>
388394
{React.cloneElement(children, {
389395
onKeyDown: this.handleKeyDown,

0 commit comments

Comments
 (0)