资源简介
react 数量控制器
AMD标准
代码:
/** * @author: zhLee * @date: 2015/8/17 * @remark: 数量控制器 */ define(['react'],function (React) { var RC = React.createClass; // 按钮 var Ctrl = RC({ clickFn: function () { this.props.handleInput(this.props.type); }, render: function () { var cls = this.props.cls, dt = this.props.data, isPlus = (this.props.type == 'plus'),// 判断是否为加号点击 btn = isPlus ? dt.isMax : dt.isMin, // 若是加,则判断btn是否达到最大值,若是减同理。 callback = isPlus ? dt.maxFn : dt.minFn, // param = isPlus ? dt.max : dt.min, txt = isPlus ? ' ' : '-'; if(btn) {// 若达到最大值或最小值,则为按钮加上disabled calss cls = cls ' ' dt.disabledCls; callback(param, dt.val); } return ( <a className={cls} href="javascript:;" onClick={this.clickFn}>{txt}</a> ); } }); // 值文本 var NumTxt = RC({ getInitialState: function () { return { val: this.props.data.val } }, shouldComponentUpdate: function (nextProps, nextState) { /*console.log(this.state.val); console.log(nextProps.data.val);*/ return true; }, // 在组件接收到新的 props 的时候调用 在此函数内this.props是指上一个props componentWillReceiveProps: function (nextProps) { this.setState({ val: nextProps.data.val }); }, _onBlur: function () { this.props.handleInput(this.refs.txt.getDOMNode().value); }, _onChange:function (event) { this.setState({ val: event.target.value }); }, render: function () { return ( <input type="tel" data-flag={this.props.data.flag} ref="txt" className="amount-input" onBlur={this._onBlur} value={this.state.val} onChange={this._onChange} name="count" /> ) } }); // 主体 return RC({ getInitialState: function () { var dt = this.props.data; // 容错 if(dt.max < dt.min) { dt.max = Infinity; } return { flag: dt.flag || '', // 文本标识 max: !isNaN(dt.max) ? parseInt(dt.max) : Infinity, // 最大值 min: !isNaN(dt.min) ? parseInt(dt.min) : 1, // 最小值 val: !isNaN(dt.val) ? parseInt(dt.val) : 1 , // 默认值/输出值 isMin: true, // 是否为最小值 isMax: false, // 是否为最大值 onChangeFn: dt.onChangeFn || function () {}, // 文本值改变回调 maxFn: dt.maxFn || function () {}, // 最大值回调 minFn: dt.minFn ||function () {}, // 最小值回调 disabledCls: dt.disabledCls || 'disabled' // 按钮不可点类名 } }, // 测试值是否合法,返回结果 checkValid: function () { var props = this.state, min = props.min, max = props.max, val = props.val, isMin = false, isMax = false; if(val <= min) { val = min; isMin = true; } if(val >= max) { val = max; isMax = true; } return { isMin: isMin, isMax: isMax, val: val }; }, handleInput: function (val) { // 获取上一次值 var lastVal = this.state.val; if(val == 'minus' && lastVal != this.state.min) { this.state.val -= 1; } else if (val == 'plus' && lastVal != this.state.max) { this.state.val = 1; } else if(parseInt(val)){ this.state.val = parseInt(val) || this.state.min; } var result = this.checkValid(); /*console.log(result.val) console.log(lastVal)*/ if(lastVal !== result.val) { this.state.onChangeFn(result.val, this.refs.input.getDOMNode()); } this.setState(result) }, render: function () { var result = this.checkValid(); this.state.val = result.val; this.state.max = this.props.max || this.state.max; // 判断最大/小值 this.state.isMax = result.isMax; this.state.isMin = result.isMin; return ( <div> <Ctrl type="minus" cls='subtract' data={this.state} handleInput={this.handleInput} /> <div className="amount"> <NumTxt ref="input" data={this.state} handleInput={this.handleInput}/> </div> <Ctrl type="plus" cls='add' data={this.state} handleInput={this.handleInput} /> </div> ); } }); });
评论
共有 条评论