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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了react 传递非state给子元素的注意事项相关的知识,希望对你有一定的参考价值。

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给子元素的注意事项的主要内容,如果未能解决你的问题,请参考以下文章

极品-------React的组件通信,生命周期,受控组件,与非受控组件

极品-------React的组件通信,生命周期,受控组件,与非受控组件

极品-------React的组件通信,生命周期,受控组件,与非受控组件

React:将图像从父组件中的 this.state 传递给子组件

关于react子组建state初始化值为父组建传来的props问题

react 组件通讯的三种方式