UNPKG

7.48 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4exports.default = undefined;
5
6var _extends2 = require('babel-runtime/helpers/extends');
7
8var _extends3 = _interopRequireDefault(_extends2);
9
10var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
11
12var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
13
14var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
15
16var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
17
18var _inherits2 = require('babel-runtime/helpers/inherits');
19
20var _inherits3 = _interopRequireDefault(_inherits2);
21
22var _class, _temp;
23
24var _react = require('react');
25
26var _react2 = _interopRequireDefault(_react);
27
28var _propTypes = require('prop-types');
29
30var _propTypes2 = _interopRequireDefault(_propTypes);
31
32var _overlay = require('../overlay');
33
34var _overlay2 = _interopRequireDefault(_overlay);
35
36var _util = require('../util');
37
38function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
39
40var noop = _util.func.noop,
41 makeChain = _util.func.makeChain,
42 bindCtx = _util.func.bindCtx;
43
44var Popup = _overlay2.default.Popup;
45
46/**
47 * Dropdown
48 * @description 继承 Popup 的 API,除非特别说明
49 */
50var Dropdown = (_temp = _class = function (_Component) {
51 (0, _inherits3.default)(Dropdown, _Component);
52
53 function Dropdown(props) {
54 (0, _classCallCheck3.default)(this, Dropdown);
55
56 var _this = (0, _possibleConstructorReturn3.default)(this, _Component.call(this, props));
57
58 _this.state = {
59 visible: 'visible' in props ? props.visible : props.defaultVisible || false,
60 autoFocus: 'autoFocus' in props ? props.autoFocus : false
61 };
62
63 bindCtx(_this, ['onTriggerKeyDown', 'onMenuClick', 'onVisibleChange']);
64 return _this;
65 }
66
67 Dropdown.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps) {
68 var state = {};
69
70 if ('visible' in nextProps) {
71 state.visible = nextProps.visible;
72 }
73
74 return state;
75 };
76
77 Dropdown.prototype.getVisible = function getVisible() {
78 var props = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : this.props;
79
80 return 'visible' in props ? props.visible : this.state.visible;
81 };
82
83 Dropdown.prototype.onMenuClick = function onMenuClick() {
84 var autoClose = this.props.autoClose;
85
86
87 if (!('visible' in this.props) && autoClose) {
88 this.setState({
89 visible: false
90 });
91 }
92 this.onVisibleChange(false, 'fromContent');
93 };
94
95 Dropdown.prototype.onVisibleChange = function onVisibleChange(visible, from) {
96 this.setState({ visible: visible });
97
98 this.props.onVisibleChange(visible, from);
99 };
100
101 Dropdown.prototype.onTriggerKeyDown = function onTriggerKeyDown() {
102 var autoFocus = true;
103
104 if ('autoFocus' in this.props) {
105 autoFocus = this.props.autoFocus;
106 }
107
108 this.setState({
109 autoFocus: autoFocus
110 });
111 };
112
113 Dropdown.prototype.render = function render() {
114 var _props = this.props,
115 trigger = _props.trigger,
116 rtl = _props.rtl,
117 autoClose = _props.autoClose;
118
119
120 var child = _react.Children.only(this.props.children);
121 var content = child;
122 if (typeof child.type === 'function' && child.type.isNextMenu) {
123 content = _react2.default.cloneElement(child, {
124 onItemClick: makeChain(this.onMenuClick, child.props.onItemClick)
125 });
126 } else if (autoClose) {
127 content = _react2.default.cloneElement(child, {
128 onClick: makeChain(this.onMenuClick, child.props.onClick)
129 });
130 }
131
132 var newTrigger = _react2.default.cloneElement(trigger, {
133 onKeyDown: makeChain(this.onTriggerKeyDown, trigger.props.onKeyDown)
134 });
135
136 return _react2.default.createElement(
137 Popup,
138 (0, _extends3.default)({}, this.props, {
139 rtl: rtl,
140 autoFocus: this.state.autoFocus,
141 trigger: newTrigger,
142 visible: this.getVisible(),
143 onVisibleChange: this.onVisibleChange,
144 canCloseByOutSideClick: true
145 }),
146 content
147 );
148 };
149
150 return Dropdown;
151}(_react.Component), _class.propTypes = {
152 prefix: _propTypes2.default.string,
153 pure: _propTypes2.default.bool,
154 rtl: _propTypes2.default.bool,
155 className: _propTypes2.default.string,
156 /**
157 * 弹层内容
158 */
159 children: _propTypes2.default.node,
160 /**
161 * 弹层当前是否显示
162 */
163 visible: _propTypes2.default.bool,
164 /**
165 * 弹层默认是否显示
166 */
167 defaultVisible: _propTypes2.default.bool,
168 /**
169 * 弹层显示或隐藏时触发的回调函数
170 * @param {Boolean} visible 弹层是否显示
171 * @param {String} type 触发弹层显示或隐藏的来源 fromContent 表示由Dropdown内容触发; fromTrigger 表示由trigger的点击触发; docClick 表示由document的点击触发
172 */
173 onVisibleChange: _propTypes2.default.func,
174 /**
175 * 触发弹层显示或者隐藏的元素
176 */
177 trigger: _propTypes2.default.node,
178 /**
179 * 触发弹层显示或隐藏的操作类型,可以是 'click','hover',或者它们组成的数组,如 ['hover', 'click']
180 */
181 triggerType: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.array]),
182 /**
183 * 设置此属性,弹层无法显示或隐藏
184 */
185 disabled: _propTypes2.default.bool,
186 /**
187 * 弹层相对于触发元素的定位, 详见 Overlay 的定位部分
188 */
189 align: _propTypes2.default.string,
190 /**
191 * 弹层相对于trigger的定位的微调, 接收数组[hoz, ver], 表示弹层在 left / top 上的增量
192 * e.g. [100, 100] 表示往右(RTL 模式下是往左) 、下分布偏移100px
193 */
194 offset: _propTypes2.default.array,
195 /**
196 * 弹层显示或隐藏的延时时间(以毫秒为单位),在 triggerType 被设置为 hover 时生效
197 */
198 delay: _propTypes2.default.number,
199 /**
200 * 弹层打开时是否让其中的元素自动获取焦点
201 */
202 autoFocus: _propTypes2.default.bool,
203 /**
204 * 是否显示遮罩
205 */
206 hasMask: _propTypes2.default.bool,
207 /**
208 * 开启后,children 不管是不是Menu,点击后都默认关掉弹层(2.x默认设置为true)
209 * @version 1.23
210 */
211 autoClose: _propTypes2.default.bool,
212 /**
213 * 隐藏时是否保留子节点
214 */
215 cache: _propTypes2.default.bool,
216 /**
217 * 配置动画的播放方式,支持 { in: 'enter-class', out: 'leave-class' } 的对象参数,如果设置为 false,则不播放动画
218 * @default { in: 'expandInDown', out: 'expandOutUp' }
219 */
220 animation: _propTypes2.default.oneOfType([_propTypes2.default.object, _propTypes2.default.bool])
221}, _class.defaultProps = {
222 prefix: 'next-',
223 pure: false,
224 defaultVisible: false,
225 autoClose: false,
226 onVisibleChange: noop,
227 triggerType: 'hover',
228 disabled: false,
229 align: 'tl bl',
230 offset: [0, 0],
231 delay: 200,
232 hasMask: false,
233 cache: false,
234 onPosition: noop
235}, _temp);
236Dropdown.displayName = 'Dropdown';
237exports.default = Dropdown;
238module.exports = exports['default'];
\No newline at end of file