关于直接修改state里面的值,组件会发生什么样的变化

直接修改state里面的属性值, 比如this.state = {a:1}, this.state.a = 2, 这样是不会触发视图更新的,同理当里面包含了一个引用类型的数据也是,直接修改,也是不会触发更新的,比如this.state = {b: [1,2,3,4]}, this.state.b.push(5), 但是,在继承的是component的情况下手动调用this.setstate({}),也是能让试图更新的,前提是componentshouldupdate返回的是true。但是,这样会引发一个后果,

当我们组件是purecomponent,通过这样写,由于执行的浅比较,引用地址没发生改变,就会导致视图不会更新。

import React, {Component, PureComponent} from 'react';
class HomeIndex extends Component {
  constructor(props) {
    super(props);
    this.state = {
      a : 1,
      b: [1,2,3,4],
      c: 5,
      d: [{
        m:1
      },
        {
          n : 2,
        }
      ],
      e: 6
    };
  }
  componentDidMount() {
    this.state.a = 2;
    this.state.b = [1,5,6]
  }

  componentWillReceiveProps(nextProps) {
    console.log('----this.props', this.props);
    console.log('----nextProps', nextProps);
  }
  
  // shouldComponentUpdate() {
  //   return true
  // }

  changeb = () => {
    console.log(1);
    const {b, d} = this.state;
    b.push('5');
    d[1].n = 3;
    this.state.c = 6;
    this.setState({
      e: 7,
    })
  };

  render() {
    console.log('我知醒了');
   return (
     <>
       <div>{this.state.a}</div>
       <div onClick={this.changeb}>{this.state.b}</div>
       <div>{this.state.d[1].n}</div>
     </>
   )
  }
}

export default HomeIndex;

对比component和PureComponent的区别

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值