diff --git a/package.json b/package.json index e3babe7..ce4ff4a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "rc-checkbox", - "version": "2.1.6", + "version": "2.1.7", "description": "checkbox ui component for react", "keywords": [ "react", @@ -56,7 +56,7 @@ "babel-runtime": "^6.23.0", "classnames": "2.x", "prop-types": "15.x", - "rc-util": "^4.0.4" + "react-lifecycles-compat": "^3.0.4" }, "devDependencies": { "core-js": "^2.5.1", diff --git a/src/Checkbox.jsx b/src/Checkbox.jsx index 2d8f148..1d22293 100644 --- a/src/Checkbox.jsx +++ b/src/Checkbox.jsx @@ -1,9 +1,9 @@ -import React from 'react'; +import React, { Component } from 'react'; import PropTypes from 'prop-types'; -import PureRenderMixin from 'rc-util/lib/PureRenderMixin'; import classNames from 'classnames'; +import { polyfill } from 'react-lifecycles-compat'; -export default class Checkbox extends React.Component { +class Checkbox extends Component { static propTypes = { prefixCls: PropTypes.string, className: PropTypes.string, @@ -23,6 +23,7 @@ export default class Checkbox extends React.Component { autoFocus: PropTypes.bool, value: PropTypes.any, }; + static defaultProps = { prefixCls: 'rc-checkbox', className: '', @@ -33,6 +34,7 @@ export default class Checkbox extends React.Component { onBlur() {}, onChange() {}, }; + constructor(props) { super(props); @@ -43,16 +45,14 @@ export default class Checkbox extends React.Component { }; } - componentWillReceiveProps(nextProps) { - if ('checked' in nextProps) { - this.setState({ - checked: nextProps.checked, - }); + static getDerivedStateFromProps(props, state) { + if ('checked' in props) { + return { + ...state, + checked: props.checked, + }; } - } - - shouldComponentUpdate(...args) { - return PureRenderMixin.shouldComponentUpdate.apply(this, args); + return null; } focus() { @@ -64,28 +64,30 @@ export default class Checkbox extends React.Component { } handleChange = (e) => { - const { props } = this; - if (props.disabled) { + const { disabled, onChange } = this.props; + if (disabled) { return; } - if (!('checked' in props)) { + if (!('checked' in this.props)) { this.setState({ checked: e.target.checked, }); } - props.onChange({ - target: { - ...props, - checked: e.target.checked, - }, - stopPropagation() { - e.stopPropagation(); - }, - preventDefault() { - e.preventDefault(); - }, - nativeEvent: e.nativeEvent, - }); + if (onChange) { + onChange({ + target: { + ...this.props, + checked: e.target.checked, + }, + stopPropagation() { + e.stopPropagation(); + }, + preventDefault() { + e.preventDefault(); + }, + nativeEvent: e.nativeEvent, + }); + } }; saveInput = (node) => { @@ -149,3 +151,7 @@ export default class Checkbox extends React.Component { ); } } + +polyfill(Checkbox); + +export default Checkbox; diff --git a/tests/index.spec.jsx b/tests/index.spec.jsx index ba13437..4d07229 100644 --- a/tests/index.spec.jsx +++ b/tests/index.spec.jsx @@ -79,4 +79,22 @@ describe('rc-checkbox', () => { mount(, { attachTo: container }); expect(handleFocus).toBeCalled(); }); + + it('onChange', () => { + const container = document.createElement('div'); + document.body.appendChild(container); + const onChange = jest.fn(); + const wrapper = mount(, { attachTo: container }); + wrapper.find('input').simulate('change'); + expect(onChange).toBeCalled(); + }); + + it('onChange disabled', () => { + const container = document.createElement('div'); + document.body.appendChild(container); + const onChange = jest.fn(); + const wrapper = mount(, { attachTo: container }); + wrapper.find('input').simulate('change'); + expect(onChange).not.toBeCalled(); + }); }); diff --git a/tests/setup.js b/tests/setup.js index 6eb7b89..684b8a6 100644 --- a/tests/setup.js +++ b/tests/setup.js @@ -1,4 +1,4 @@ -global.requestAnimationFrame = global.requestAnimationFrame || function (cb) { +global.requestAnimationFrame = global.requestAnimationFrame || function requestAnimationFrame(cb) { return setTimeout(cb, 0); };