美文网首页
react学习资料六

react学习资料六

作者: 九泰修行 | 来源:发表于2017-02-15 15:17 被阅读20次

    一、复习

    1. 约束组件(表单对于input(tyoe=text)等等用value,单选框和多选框设置checked)
      组件内部的信息状态交由组件管理,由state状态来管理;
      value或checked来设置默认状态值,获取组件的值也就是状态。
      onChange方法来更改组件内部的状态;

    2. 非约束组件(表单)
      组件(元素)的内部信息交由元素自身管理;
      defaultValue或defaultChecked来设置默认值,获取值通过ref设置来获取;
      ref是非元素属性,获取虚拟dom的快捷方式;ref="name"
      this.refs.name来获取,对象就是虚拟dom;

    3. 非元素属

    • key 当循环创建列表元素的时候,会使用该属性来标识;
    • ref 获取元素的快捷方式,获取通过this.refs来获取;
    • dangerouslySetInnerHTML 设置元素内容的值,接收一个对象,对象有一个属性__html,用来设置元素的内容,插入的值是任意字符串,比如html标签,可以掺入行内式的样式等;
    1. 父组件向子组件信息传递
      通过父组件对子组件添加属性来实现的,子组件通过this.props来获取父组件的消息;
      第一种情况:添加的属性是一个固定值(字符串),父组件每次更新的时候,子组件的属性不会变化;
      第二种情况:添加的属性是一个父组件中的变量,父组件每次更新的时候,如果该变量更新了,子组件也会更新;
      第三种情况:添加属性是父组件中的状态,父组件每次更新,该方法不会更新,但是子组件内部发生交互的时候,可能会调用该父组件传递的方法,在该方法中如果改变了父组件的状态,(子组件向父组件传递信息);
      第四种情况:添加的属性是父组件中的属性,此时父组件属性更新了,子组件会更新;
      第五种情况:添加的属性是父组件中的状态,此时父组件状态更新了,子组件会更新;
    1. 获取组件中的元素
      ReactDOM.findDOMNode(this) 获取的是整个组件
      ReactDOM.findDOMNode(this.refs.name) 获取的ref元素

    ========================================================================

    二、兄弟组件之间的信息传递(双向绑定)

    每个子组件都有自己的完整空间,彼此没有联系,因此他们之间最大的难题就是信息的传递;
    我们知道父组件可以和子组件通信,通过设置子组件的属性;
    父组件除了可以向子组件传递固定值,属性值,状态值,还可以传递函数;
    父组件的方法如果绑定在了子组件的元素事件上,那么在该方法中,事件对象的target是组件绑定事件的元素,e.target.value就是要获取的子组件的值;而this则是父组件自己,通过this.setState来讲子组件的值传递给另一个子组件;
    该方法需要通过共同的父组件实现;

    如果一个兄弟组件向另一个兄弟组件传递信息,流程是由该兄弟组件向父组件传递信息,再由该父组件代理向另一个子组件传递;可以学习Project的代码;

    var InputMsg = React.createClass({
    
        render:function(){
            // console.log(this.props.changeMsg)如果把父组件传递的这个函数绑定到子组件的onChange事件上会发生什么呢?
            return (
                <div>
                    <input type="text" onChange={this.props.changeMsg}/>
                </div>
            )
        }
    })
    
    var ShowMsg = React.createClass({
        render:function(){
            return (
                <div>
                    <ul>
                        <p>{this.props.msg}</p>
                    </ul>
                </div>
            )
        }
    })
    
    var Main = React.createClass({
        getInitialState:function(){
            return {
                msg:'world'
            }
        },
        changeMsg:function(e){
            //事件对象是子组件中的Input,而this指向的是父组件自己;
            // console.log(111,e,222,this)
            // console.log(e.target.value)//该值就是子组件InputMsg的值,也是要传递给ShowMsg的值
            var value = e.target.value;
            this.setState({
                msg:value
            })
        },
        render:function(){
            return (
                <div className="main">
                    <InputMsg changeMsg={this.changeMsg}/>
                    <ShowMsg  msg={this.state.msg}/>
                </div>
            )
        }
    })
    
    ReactDOM.render(<Main />,document.getElementById('app'))
    

    =======================================================================

    混合

    react支持混合,将混合中的方法复制到组件对象中,这样组件对象就可以使用该方法了;

    在组件外部定义个对象

    var MethodMixin = {//混合方法,把公用的部分提取出来
        getData:function(url,callback){
            var xhr = new XMLHttpRequest();
            xhr.onreadystatechange = function(){
                //
                if (xhr.readyState == 4){
                        if(xhr.status == 200){
                            var obj = JSON.parse(xhr.responseText)
                            callback(obj)
                        } else{
                            console.log('请求失败')
                        }
                }
            }
            xhr.open("GET",url,true);
            xhr.send(null);
        }
    }
    

    组件内部调用,注意:这是一个数组,我们们可以通过混合复制多个对象上的属性方法,因此混合可以看作是一种多继承;es6中实现了继承,就不要用这个方法了;

    mixins: [MethodMixin],//调用混合
    

    使用混合当中的方法

    componentDidMount:function(){
            var me = this;
            this.getData('data/start.json',function(res){//通过混合就能this.调用混合对象的getData方法
                // console.log(res)
                me.setState({
                    article:res,
    
                    aside:me.asideAdaptor(res)
                })
            })
        }
    

    ========================================================================================================

    组件提炼

    通常一个组件做一件事,方便复用;

    相关文章

      网友评论

          本文标题:react学习资料六

          本文链接:https://www.haomeiwen.com/subject/wweqwttx.html