react学习资料六

一、复习

  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)
            })
        })
    }

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

组件提炼

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,084评论 19 139
  • 深入JSX date:20170412笔记原文其实JSX是React.createElement(componen...
    gaoer1938阅读 12,476评论 2 35
  • 这篇笔记主要包含 Vue 2 不同于 Vue 1 或者特有的内容,还有我对于 Vue 1.0 印象不深的内容。关于...
    云之外阅读 10,474评论 0 29
  • 原教程内容详见精益 React 学习指南,这只是我在学习过程中的一些阅读笔记,个人觉得该教程讲解深入浅出,比目前大...
    leonaxiong阅读 7,858评论 1 18
  • It's a common pattern in React to wrap a component in an ...
    jplyue阅读 8,529评论 0 2

友情链接更多精彩内容