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

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

组件提炼

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,012评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,628评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,653评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,485评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,574评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,590评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,596评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,340评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,794评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,102评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,276评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,940评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,583评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,201评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,441评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,173评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,136评论 2 352

推荐阅读更多精彩内容

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