From 9960f49db69311fdb067920ef3d6ef6c81d9c319 Mon Sep 17 00:00:00 2001 From: paranoidjk Date: Fri, 3 Mar 2017 15:30:30 +0800 Subject: [PATCH] fix: split TouchEvents amd MouseEvents. close #48 --- src/index.js | 40 ++++++++++++++++------ tests/index.js | 92 +++++++++++++++++++++++++++++++++++++++++++------- 2 files changed, 108 insertions(+), 24 deletions(-) diff --git a/src/index.js b/src/index.js index 8114c405..5f18a835 100644 --- a/src/index.js +++ b/src/index.js @@ -29,6 +29,7 @@ const InputNumber = React.createClass({ ]), upHandler: PropTypes.node, downHandler: PropTypes.node, + useTouch: PropTypes.bool, }, mixins: [mixin], @@ -36,6 +37,7 @@ const InputNumber = React.createClass({ getDefaultProps() { return { focusOnUpDown: true, + useTouch: false, prefixCls: 'rc-input-number', }; }, @@ -82,7 +84,7 @@ const InputNumber = React.createClass({ render() { const props = { ...this.props }; - const { prefixCls, disabled, readOnly } = props; + const { prefixCls, disabled, readOnly, useTouch } = props; const classes = classNames({ [prefixCls]: true, [props.className]: !!props.className, @@ -120,6 +122,30 @@ const InputNumber = React.createClass({ inputDisplayValue = ''; } + let upEvents; + let downEvents; + if (useTouch) { + upEvents = { + onTouchStart: (editable && !upDisabledClass) ? this.up : noop, + onTouchEnd: this.stop, + }; + downEvents = { + onTouchStart: (editable && !downDisabledClass) ? this.down : noop, + onTouchEnd: this.stop, + }; + } else { + upEvents = { + onMouseDown: (editable && !upDisabledClass) ? this.up : noop, + onMouseUp: this.stop, + onMouseLeave: this.stop, + }; + downEvents = { + onMouseDown: (editable && !downDisabledClass) ? this.down : noop, + onMouseUp: this.stop, + onMouseLeave: this.stop, + }; + } + // ref for test return (
@@ -129,11 +155,7 @@ const InputNumber = React.createClass({ disabled={!!upDisabledClass || disabled || readOnly} prefixCls={prefixCls} unselectable="unselectable" - onTouchStart={(editable && !upDisabledClass) ? this.up : noop} - onTouchEnd={this.stop} - onMouseDown={(editable && !upDisabledClass) ? this.up : noop} - onMouseUp={this.stop} - onMouseLeave={this.stop} + {...upEvents} className={`${prefixCls}-handler ${prefixCls}-handler-up ${upDisabledClass}`} > {this.props.upHandler || {this.props.downHandler || { }); }); - describe('touchable', () => { - it('up button works', () => { - Simulate.touchStart(ReactDOM.findDOMNode(inputNumber.refs.up)); - expect(inputNumber.state.value).to.be(99); - }); - - it('down button works', () => { - Simulate.touchStart(ReactDOM.findDOMNode(inputNumber.refs.down)); - expect(inputNumber.state.value).to.be(97); - }); - }); - describe('long press', () => { it('up button works', (done) => { Simulate.mouseDown(ReactDOM.findDOMNode(inputNumber.refs.up)); @@ -592,3 +580,81 @@ describe('inputNumber', () => { }); }); }); + +describe('Mobile inputNumber use TouchEvents', () => { + const container = document.createElement('div'); + document.body.appendChild(container); + let onChangeFirstArgument; + let onChangeCallCount = 0; + + const Component = React.createClass({ + getInitialState() { + return { + min: 1, + max: 200, + value: defaultValue, + step: 1, + disabled: false, + autoFocus: false, + readOnly: false, + name: 'inputNumber', + }; + }, + onChange(value) { + onChangeFirstArgument = value; + onChangeCallCount += 1; + this.setState({ value }); + }, + triggerBoolean(propName) { + const prop = {}; + prop[propName] = !this.state[propName]; + this.setState(prop); + }, + render() { + return ( +
+ +
+ ); + }, + }); + + let inputNumber; + let example; + let inputElement; + beforeEach(() => { + example = ReactDOM.render(, container); + inputNumber = example.refs.inputNum; + inputElement = ReactDOM.findDOMNode(inputNumber.refs.input); + onChangeCallCount = 0; + }); + + afterEach(() => { + ReactDOM.unmountComponentAtNode(container); + onChangeCallCount = 0; + }); + + describe('touchable', () => { + it('up button works', () => { + Simulate.touchStart(ReactDOM.findDOMNode(inputNumber.refs.up)); + expect(inputNumber.state.value).to.be(99); + }); + + it('down button works', () => { + Simulate.touchStart(ReactDOM.findDOMNode(inputNumber.refs.down)); + expect(inputNumber.state.value).to.be(97); + }); + }); +});