UNPKG

11.4 kBJavaScriptView Raw
1'use strict';
2
3exports.__esModule = true;
4
5var _extends2 = require('babel-runtime/helpers/extends');
6
7var _extends3 = _interopRequireDefault(_extends2);
8
9var _objectWithoutProperties2 = require('babel-runtime/helpers/objectWithoutProperties');
10
11var _objectWithoutProperties3 = _interopRequireDefault(_objectWithoutProperties2);
12
13var _classCallCheck2 = require('babel-runtime/helpers/classCallCheck');
14
15var _classCallCheck3 = _interopRequireDefault(_classCallCheck2);
16
17var _createClass2 = require('babel-runtime/helpers/createClass');
18
19var _createClass3 = _interopRequireDefault(_createClass2);
20
21var _possibleConstructorReturn2 = require('babel-runtime/helpers/possibleConstructorReturn');
22
23var _possibleConstructorReturn3 = _interopRequireDefault(_possibleConstructorReturn2);
24
25var _inherits2 = require('babel-runtime/helpers/inherits');
26
27var _inherits3 = _interopRequireDefault(_inherits2);
28
29var _class, _temp;
30
31var _react = require('react');
32
33var _react2 = _interopRequireDefault(_react);
34
35var _propTypes = require('prop-types');
36
37var _propTypes2 = _interopRequireDefault(_propTypes);
38
39var _classnames4 = require('classnames');
40
41var _classnames5 = _interopRequireDefault(_classnames4);
42
43var _reactLifecyclesCompat = require('react-lifecycles-compat');
44
45var _mixinUiState = require('../mixin-ui-state');
46
47var _mixinUiState2 = _interopRequireDefault(_mixinUiState);
48
49var _configProvider = require('../config-provider');
50
51var _configProvider2 = _interopRequireDefault(_configProvider);
52
53var _withContext = require('./with-context');
54
55var _withContext2 = _interopRequireDefault(_withContext);
56
57var _util = require('../util');
58
59function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; }
60
61var makeChain = _util.func.makeChain,
62 noop = _util.func.noop;
63/**
64 * Radio
65 * @order 1
66 */
67
68var Radio = (_temp = _class = function (_UIState) {
69 (0, _inherits3.default)(Radio, _UIState);
70
71 function Radio(props) {
72 (0, _classCallCheck3.default)(this, Radio);
73
74 var _this = (0, _possibleConstructorReturn3.default)(this, _UIState.call(this, props));
75
76 var context = props.context;
77
78 var checked = void 0;
79 if (context.__group__) {
80 checked = context.selectedValue === props.value;
81 } else if ('checked' in props) {
82 checked = props.checked;
83 } else {
84 checked = props.defaultChecked;
85 }
86
87 _this.state = { checked: checked };
88
89 _this.onChange = _this.onChange.bind(_this);
90 return _this;
91 }
92
93 Radio.getDerivedStateFromProps = function getDerivedStateFromProps(nextProps) {
94 var nextContext = nextProps.context;
95
96
97 if (nextContext.__group__ && 'selectedValue' in nextContext) {
98 return {
99 checked: nextContext.selectedValue === nextProps.value
100 };
101 } else if ('checked' in nextProps) {
102 return {
103 checked: nextProps.checked
104 };
105 }
106
107 return null;
108 };
109
110 Radio.prototype.shouldComponentUpdate = function shouldComponentUpdate(nextProps, nextState, nextContext) {
111 var shallowEqual = _util.obj.shallowEqual;
112
113 return !shallowEqual(this.props, nextProps) || !shallowEqual(this.state, nextState) || !shallowEqual(this.context, nextContext);
114 };
115
116 Radio.prototype.componentDidUpdate = function componentDidUpdate() {
117 // when disabled, reset UIState
118 if (this.disabled) {
119 // only class has an impact, no effect on visual
120 this.resetUIState();
121 }
122 };
123
124 Radio.prototype.onChange = function onChange(e) {
125 var checked = e.target.checked;
126 var _props = this.props,
127 context = _props.context,
128 value = _props.value;
129
130
131 if (context.__group__) {
132 context.onChange(value, e);
133 } else if (this.state.checked !== checked) {
134 if (!('checked' in this.props)) {
135 this.setState({
136 checked: checked
137 });
138 }
139 this.props.onChange(checked, e);
140 }
141 };
142
143 Radio.prototype.render = function render() {
144 var _classnames, _classnames2, _classnames3;
145
146 /* eslint-disable no-unused-vars */
147 var _props2 = this.props,
148 id = _props2.id,
149 className = _props2.className,
150 children = _props2.children,
151 style = _props2.style,
152 label = _props2.label,
153 onMouseEnter = _props2.onMouseEnter,
154 onMouseLeave = _props2.onMouseLeave,
155 tabIndex = _props2.tabIndex,
156 rtl = _props2.rtl,
157 name = _props2.name,
158 isPreview = _props2.isPreview,
159 renderPreview = _props2.renderPreview,
160 value = _props2.value,
161 context = _props2.context,
162 otherProps = (0, _objectWithoutProperties3.default)(_props2, ['id', 'className', 'children', 'style', 'label', 'onMouseEnter', 'onMouseLeave', 'tabIndex', 'rtl', 'name', 'isPreview', 'renderPreview', 'value', 'context']);
163
164 var checked = !!this.state.checked;
165 var disabled = this.disabled;
166 var isButton = context.isButton;
167 var prefix = context.prefix || this.props.prefix;
168
169 var others = _util.obj.pickOthers(Radio.propTypes, otherProps);
170 var othersData = _util.obj.pickAttrsWith(others, 'data-');
171
172 if (isPreview) {
173 var previewCls = (0, _classnames5.default)(className, prefix + 'form-preview');
174
175 if ('renderPreview' in this.props) {
176 return _react2.default.createElement(
177 'div',
178 (0, _extends3.default)({ id: id, dir: rtl ? 'rtl' : 'ltr' }, others, { className: previewCls }),
179 renderPreview(checked, this.props)
180 );
181 }
182
183 return _react2.default.createElement(
184 'p',
185 (0, _extends3.default)({ id: id, dir: rtl ? 'rtl' : 'ltr' }, others, { className: previewCls }),
186 checked && (children || label || value)
187 );
188 }
189
190 var input = _react2.default.createElement('input', (0, _extends3.default)({}, _util.obj.pickOthers(othersData, others), {
191 name: name,
192 id: id,
193 tabIndex: tabIndex,
194 disabled: disabled,
195 checked: checked,
196 type: 'radio',
197 onChange: this.onChange,
198 'aria-checked': checked,
199 className: prefix + 'radio-input'
200 }));
201
202 // disabled do not hove focus state
203 if (!disabled) {
204 input = this.getStateElement(input);
205 }
206
207 var cls = (0, _classnames5.default)((_classnames = {}, _classnames[prefix + 'radio'] = true, _classnames.checked = checked, _classnames.disabled = disabled, _classnames[this.getStateClassName()] = true, _classnames));
208 var clsInner = (0, _classnames5.default)((_classnames2 = {}, _classnames2[prefix + 'radio-inner'] = true, _classnames2.press = checked, _classnames2.unpress = !checked, _classnames2));
209 var clsWrapper = (0, _classnames5.default)((_classnames3 = {}, _classnames3[prefix + 'radio-wrapper'] = true, _classnames3[className] = !!className, _classnames3.checked = checked, _classnames3.disabled = disabled, _classnames3[this.getStateClassName()] = true, _classnames3));
210 var childrenCls = prefix + 'radio-label';
211
212 var radioComp = !isButton ? _react2.default.createElement(
213 'span',
214 { className: cls },
215 _react2.default.createElement('span', { className: clsInner }),
216 input
217 ) : _react2.default.createElement(
218 'span',
219 { className: prefix + 'radio-single-input' },
220 input
221 );
222
223 return _react2.default.createElement(
224 'label',
225 (0, _extends3.default)({}, othersData, {
226 dir: rtl ? 'rtl' : 'ltr',
227 style: style,
228 'aria-checked': checked,
229 'aria-disabled': disabled,
230 className: clsWrapper,
231 onMouseEnter: disabled ? onMouseEnter : makeChain(this._onUIMouseEnter, onMouseEnter),
232 onMouseLeave: disabled ? onMouseLeave : makeChain(this._onUIMouseLeave, onMouseLeave)
233 }),
234 radioComp,
235 [children, label].map(function (d, i) {
236 return d !== undefined ? _react2.default.createElement(
237 'span',
238 { key: i, className: childrenCls },
239 d
240 ) : null;
241 })
242 );
243 };
244
245 (0, _createClass3.default)(Radio, [{
246 key: 'disabled',
247 get: function get() {
248 var props = this.props;
249 var context = props.context;
250
251
252 var disabled = props.disabled || context.__group__ && 'disabled' in context && context.disabled;
253
254 return disabled;
255 }
256 }]);
257 return Radio;
258}(_mixinUiState2.default), _class.displayName = 'Radio', _class.propTypes = (0, _extends3.default)({}, _configProvider2.default.propTypes, {
259 /**
260 * 自定义类名
261 */
262 className: _propTypes2.default.string,
263 /**
264 * 组件input的id
265 */
266 id: _propTypes2.default.string,
267 /**
268 * 自定义内敛样式
269 */
270 style: _propTypes2.default.object,
271 /**
272 * 设置radio是否选中
273 */
274 checked: _propTypes2.default.bool,
275 /**
276 * 设置radio是否默认选中
277 */
278 defaultChecked: _propTypes2.default.bool,
279 /**
280 * 通过属性配置label
281 */
282 label: _propTypes2.default.node,
283 /**
284 * 状态变化时触发的事件
285 * @param {Boolean} checked 是否选中
286 * @param {Event} e Dom 事件对象
287 */
288 onChange: _propTypes2.default.func,
289 /**
290 * 鼠标进入enter事件
291 * @param {Event} e Dom 事件对象
292 */
293 onMouseEnter: _propTypes2.default.func,
294 /**
295 * 鼠标离开事件
296 * @param {Event} e Dom 事件对象
297 */
298 onMouseLeave: _propTypes2.default.func,
299 /**
300 * radio是否被禁用
301 */
302 disabled: _propTypes2.default.bool,
303 /**
304 * radio 的value
305 */
306 value: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number, _propTypes2.default.bool]),
307 /**
308 * name
309 */
310 name: _propTypes2.default.string,
311 /**
312 * 是否为预览态
313 */
314 isPreview: _propTypes2.default.bool,
315 /**
316 * 预览态模式下渲染的内容
317 * @param {Boolean} checked 是否选中
318 * @param {Object} props 所有传入的参数
319 * @returns {reactNode} Element 渲染内容
320 */
321 renderPreview: _propTypes2.default.func
322}), _class.defaultProps = {
323 onChange: noop,
324 onMouseLeave: noop,
325 onMouseEnter: noop,
326 tabIndex: 0,
327 prefix: 'next-',
328 isPreview: false
329}, _class.contextTypes = {
330 onChange: _propTypes2.default.func,
331 __group__: _propTypes2.default.bool,
332 isButton: _propTypes2.default.bool,
333 selectedValue: _propTypes2.default.oneOfType([_propTypes2.default.string, _propTypes2.default.number, _propTypes2.default.bool]),
334 disabled: _propTypes2.default.bool
335}, _temp);
336exports.default = _configProvider2.default.config((0, _withContext2.default)((0, _reactLifecyclesCompat.polyfill)(Radio)));
337module.exports = exports['default'];
\No newline at end of file