实例介绍
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小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


网友评论
我要评论