在好例子网,分享、交流、成长!
您当前所在位置:首页js 开发实例Ajax框架/RIA → react组件-数量控制器

react组件-数量控制器

Ajax框架/RIA

下载此实例
  • 开发语言:js
  • 实例大小:5.41KB
  • 下载次数:11
  • 浏览次数:274
  • 发布时间:2015-12-04
  • 实例类别:Ajax框架/RIA
  • 发 布 人:q284065612
  • 文件格式:.js
  • 所需积分:1
 相关标签: react

实例介绍

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

实例下载地址

react组件-数量控制器

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

发表评论

(您的评论需要经过审核才能显示)

查看所有0条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警