我们是使用react的时候,其实很多情况都不需要使用state去存储值,如果不涉及页面渲染的值,我们往往可以使用 this.xxx的方式;这样可以提高组件的性能,避免不必要的 re_render 带来的消耗
但是如果不稍加注意,可能就会给自己带来很多隐患,甚至bug;
请看如下代码:用非state值向子组件传递一个page属性
export default class Test extends PureComponent {
constructor(props) {
super(props);
  //通常我们会把分页的相关信息page为此类的属性,而不是state,因为分页相关的信息,基本不影响渲染,更多的是程序内部的请求使用
this.page = {
pageNum: 1,
pageSize: 10,
};
} handlePageChange = (pagination) => {//分页变化时触发
  /***重点***/
Object.assign(this.page, {
pageNum: pagination.current,
pageSize: pagination.pageSize,
});
}; render() {
  return (
    <A
      page={this.page}
      handlePageChange={this.handlePageChange}
    />
  );
}
上面代码中的【重点】红色的部分,初学者(像我之前)往往会使用es6的结构赋值语法代替,代码如下:
//如果用以下代码,代替上面的红色部分,最终的结果就会是:    this.page !== A的props.page
this.page = {
...this.page,
pageNum: 1,
};

这样的话,会就等于重新创建了一个新的对象,给this.page重新赋值了,

也就是说:我们之前的render中就把this.page对象传递给了子组件,而原来的对象已经与现在的不是同一个了,(现在的是刚刚出炉的新对象),

而且:this.page的改变,与state不同,并不会引起组件的re_render,所以对<A>组件的props的传递并不会再次执行,所以这时候<A>的this.props.page !== <Test>的this.page。他们是两个完全不相干的对象;这时候就会引起BUG

总结:如果要传递引用类型给子元素,并且想要保持与父子元素永远指向同一个对象,就不能使用解构赋值,而应该使用: Object.assign( this.page,{ } ); 或者直接 this,page.key = xx;这样就能保证传递给子组件的引用类型,永远是内存中的同一个地址,实现与父组件的同步;

如果传递的是state,则可以无需注意这个,因为当你重新赋值为新对象的时候,程序会执行re_render方法,子组件就会重新获取props,实现与父的实时同步

react 传递非state给子元素的注意事项的更多相关文章

  1. 在Js中得到元素的子元素集合注意事项

    http://www.cnblogs.com/phonefans/archive/2008/09/04/1283739.html 在Js中得到元素的子元素集合注意事项 费话少说,直接看例子: 1 &l ...

  2. 当fixed元素相互嵌套时chrome下父元素会影响子元素的层叠关系

    问题:fixed元素被另一个fixed元素包含的时候在chrome下fixed子元素的定位会受到父元素的影响. demo(http://jsbin.com/qumah/1): <!DOCTYPE ...

  3. 当fixed元素相互嵌套时,父元素会影响子元素的层叠关系,最好不要嵌套使用fixed

    问题:fixed元素被另一个fixed元素包含的时候在chrome下fixed子元素的定位会受到父元素的影响. 解释:层叠关系是受层叠上下文影响的.文档中的层叠上下文由满足以下任意一个条件的元素形成: ...

  4. 七天接手react项目 —— 生命周期&受控和非受控组件&Dom 元素&Diffing 算法

    生命周期&受控和非受控组件&Dom 元素&Diffing 算法 生命周期 首先回忆一下 vue 中的生命周期: vue 对外提供了生命周期的钩子函数,允许我们在 vue 的各个 ...

  5. React中父组件与子组件之间的数据传递和标准化的思考

    React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...

  6. react 子元素修改父元素值的一个偏方,虽然简单,但是不建议用,

    this.state.obj = { name: "小明" } <Zizujian obj={this.state.obj} /> // 子组件这样修改父元素的值 // ...

  7. React访问组件元素的子元素(ES5与ES6的对比)

    // 创建组件var NewDom = React.createClass({ // 类名一定要大写开头 render: function () { return ( <ol> { Rea ...

  8. margin传递,子元素的上下margin会传递给父级

    <!doctype html> <html> <head> <meta charset="utf-8"> <title> ...

  9. jquery父元素和子元素点击事件传递问题_不可把父元素的事件传递给子元素_事件无限循环传递

    前述:jquery中: 当一个元素的点击事件被触发时,会自动将该事件向父级元素逐级专递. 但是实际场景当中,我们可能会遇到需要在父级元素中定义点击事件,来触发特定子元素的点击事件,我就遇到了这么一个问 ...

随机推荐

  1. c++中的const和volatile知识自我总结

    学习了下c++中的const关键字,总结如下. 1.const限制一个变量不能修改其内容,如果强行修改的话,如下面代码这样子,编译就会报错,“表达式必须是可修改的左值”. int main() { c ...

  2. sql开启远程访问

    我们用的是SQL Server 数据库 2008 版本,数据库配置完之后从另一台电脑访问数据库死活连接不上,提示信息如下 “ 无法连接到 *.*.*.*. 在于SQL Server建立连接时出现与网络 ...

  3. 【tomcat】servlet原理及其生命周期

    1.什么是servlet? Servlet(Servlet Applet),全称Java Servlet,是用Java编写的服务器端程序.而这些Servlet都要实现Servlet这个接口.其主要功能 ...

  4. C语言写了一个socket server端,适合windows和linux,用GCC编译运行通过

    ////////////////////////////////////////////////////////////////////////////////* gcc -Wall -o s1 s1 ...

  5. 解决Maven的Could not resolve archetype org.apache.maven.archetypes:maven-archetype-quickstart

    eclipse配置好了Maven,创建maven-archetype-quickstart项目报错如下: Could not resolve archetype org.apache.maven.ar ...

  6. php完美匹配邮箱、链接地址和电话号码

    php完美匹配邮箱.链接地址和电话号码 写了好一会有问题,朋友这边很好功能,借用了.嘎嘎 //31日 更新: 匹配手机以及电话号码 重新修改,可支持18开头的手机号,并修改bug,可匹配出字符串中所有 ...

  7. 一道JS面试题引发的血案

    刚入职新公司,属于公司萌新一枚,一天下午对着屏幕看代码架构时. BI项目组长给我看了一道面试别人的JS面试题. 虽然答对了,但把理由说错了,照样不及格. 话不多说,直接上题: var a = 1; s ...

  8. Linux MBR扇区误删恢复

    目录 1. 引导记录误删恢复 1.1 备份引导记录 1.2 误删引导记录 1.3 恢复引导记录 2. 分区表误删恢复 2.1 备份分区表 2.2 误删分区表 2.3 恢复分区表 如果MBR分区表没了, ...

  9. Linux 变量的使用

    目录 1. Shell 脚本规范 2. Shell 脚本执行 3. Shell 脚本变量 3.1 环境变量 3.1.1 自定义环境变量 3.1.2 显示与取消环境变量 3.1.3 环境变量初始化与对应 ...

  10. spec 文件详解

    转自http://blog.sina.com.cn/s/blog_43b39e250100nnu4.html rpm软件包系统的标准分组:/usr/share/doc/rpm-4.3.3/GROUPS ...