Skip to content

Commit f740da2

Browse files
rinickzombieJ
authored andcommitted
supports overlay callback (#53)
* supports overlay callback * add test for overlay callback
1 parent f3007b0 commit f740da2

File tree

4 files changed

+73
-5
lines changed

4 files changed

+73
-5
lines changed

examples/overlay-callback.html

Whitespace-only changes.

examples/overlay-callback.js

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
/* eslint-disable no-console */
2+
import Dropdown from 'rc-dropdown';
3+
import Menu, { Item as MenuItem, Divider } from 'rc-menu';
4+
import 'rc-dropdown/assets/index.less';
5+
import React from 'react';
6+
import ReactDOM from 'react-dom';
7+
8+
function onSelect({ key }) {
9+
console.log(`${key} selected`);
10+
}
11+
12+
function onVisibleChange(visible) {
13+
console.log(visible);
14+
}
15+
16+
const menuCallback = () => (
17+
<Menu onSelect={onSelect}>
18+
<MenuItem disabled>disabled</MenuItem>
19+
<MenuItem key="1">one</MenuItem>
20+
<Divider />
21+
<MenuItem key="2">two</MenuItem>
22+
</Menu>
23+
);
24+
25+
ReactDOM.render(
26+
<div style={{ margin: 20 }}>
27+
<div style={{ height: 100 }}/>
28+
<div>
29+
<Dropdown
30+
trigger={['click']}
31+
overlay={menuCallback}
32+
animation="slide-up"
33+
onVisibleChange={onVisibleChange}
34+
>
35+
<button style={{ width: 100 }}>open</button>
36+
</Dropdown>
37+
</div>
38+
</div>
39+
, document.getElementById('__react-content'));

src/Dropdown.jsx

Lines changed: 22 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,10 @@ class Dropdown extends Component {
2020
align: PropTypes.object,
2121
overlayStyle: PropTypes.object,
2222
placement: PropTypes.string,
23-
overlay: PropTypes.node,
23+
overlay: PropTypes.oneOfType([
24+
PropTypes.node,
25+
PropTypes.func,
26+
]),
2427
trigger: PropTypes.array,
2528
alignPoint: PropTypes.bool,
2629
showAction: PropTypes.array,
@@ -100,16 +103,30 @@ class Dropdown extends Component {
100103
return !alignPoint;
101104
};
102105

103-
getMenuElement() {
106+
getMenuElement = () => {
104107
const { overlay, prefixCls } = this.props;
108+
let overlayElement;
109+
if (typeof overlay === 'function') {
110+
overlayElement = overlay();
111+
} else {
112+
overlayElement = overlay;
113+
}
105114
const extraOverlayProps = {
106115
prefixCls: `${prefixCls}-menu`,
107116
onClick: this.onClick,
108117
};
109-
if (typeof overlay.type === 'string') {
118+
if (typeof overlayElement.type === 'string') {
110119
delete extraOverlayProps.prefixCls;
111120
}
112-
return React.cloneElement(overlay, extraOverlayProps);
121+
return React.cloneElement(overlayElement, extraOverlayProps);
122+
}
123+
124+
getMenuElementOrLambda() {
125+
const { overlay } = this.props;
126+
if (typeof overlay === 'function') {
127+
return this.getMenuElement;
128+
}
129+
return this.getMenuElement();
113130
}
114131

115132
getPopupDomNode() {
@@ -183,7 +200,7 @@ class Dropdown extends Component {
183200
popupAnimation={animation}
184201
popupVisible={this.state.visible}
185202
afterPopupVisibleChange={this.afterVisibleChange}
186-
popup={this.getMenuElement()}
203+
popup={this.getMenuElementOrLambda()}
187204
onPopupVisibleChange={this.onVisibleChange}
188205
getPopupContainer={getPopupContainer}
189206
>

tests/basic.js

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -192,4 +192,16 @@ describe('dropdown', () => {
192192
Simulate.click(buttonNode);
193193
expect(buttonNode.className).to.be('my-button');
194194
});
195+
196+
it('overlay callback', () => {
197+
const overlay = <div style={{ width: 50 }}>Test</div>;
198+
const dropdown = ReactDOM.render(
199+
<Dropdown trigger={['click']} overlay={() => overlay}>
200+
<button className="my-button">open</button>
201+
</Dropdown>
202+
, div);
203+
Simulate.click(TestUtils.scryRenderedDOMComponentsWithClass(dropdown, 'my-button')[0]);
204+
expect($(ReactDOM.findDOMNode(TestUtils.scryRenderedDOMComponentsWithClass(dropdown,
205+
'rc-dropdown')[0])).css('display')).not.to.be('none');
206+
});
195207
});

0 commit comments

Comments
 (0)