码迷,mamicode.com
首页 > 其他好文 > 详细

react 传递非state给子元素的注意事项

时间:2018-01-22 20:32:16      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:col   结构   内存   nbsp   一个   类的属性   return   bsp   重点   

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 = {
  ...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给子元素的注意事项

标签:col   结构   内存   nbsp   一个   类的属性   return   bsp   重点   

原文地址:https://www.cnblogs.com/zhilingege/p/8330918.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!