实例介绍
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> ); } }); });
标签: react
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明
网友评论
我要评论