对react中setState的总结

setState 如何工作:

正常来说:每次调用 setState 修改属性后,都会触发重新渲染组件。

而重新渲染组件的方法则是一个 updater 方法。这个方法会在React Dom/React Dom Server/React Native 创建类的实例之后立即设置。这也是,不同环境下使用setState都产生一致效果的原因。

而不正常的请情况下,比如同一个方法内,多次调用 setState ,它们只会触发一次 re-render。但是同一个方法的异步调用 setState 则会调用同setState次数的 re-render (updater):

// 同步调用
onClick = () => {
    let { count } = this.state;
    
    this.setState({
        count: ++count
    });
    
    this.setState({
        count: ++count
    });
} // re-render 次数:1

// 异步调用
onClickAsync = () => {
    let { count } = this.state;
    
    this.setState({
        count: ++count
    });
    
    setTimeout(() => {
        this.setState({
            count: ++count
        });
    }, 0);
} // re-render 次数:2
复制代码

而在 render 方法或者 componentWillUpdate / componentDidUpdate 内部调用了 setState,因为 setState会触发重新渲染组件,因此会出现循环调用的情况。此时React会抛出错误Maximum update depth exceeded.,超出最大更新深度,这是因为React限制了嵌套更新的数量以防止无限循环。

有总结才有收获。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值