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);
};