React class里setTimeOut里setState不会批量更新

本文解析React setState的异步特性,探讨如何在setTimeout中确保正确渲染,并介绍三种获取setState后state值的方法:回调、prevState和setTimeout。

先看下这段代码:

import React from 'react'

export default class HK extends React.Component{
    constructor(props){
        super(props)
        this.state = {
            val: 0
        }
    }

    componentDidMount(){
        this.setState({val:this.state.val + 1})
        console.log('HK------------->1', this.state.val)
        this.setState({val:this.state.val + 1})
        console.log('HK------------->2', this.state.val)

        setTimeout(() => {
            this.setState({val:this.state.val + 1})
            console.log('HK------------->3', this.state.val)
            this.setState({val:this.state.val + 1})
            console.log('HK------------->4', this.state.val)
        }, 0)
    }

    render(){
        return null
    }
}

输出结果为:
在这里插入图片描述
我们知道react的setState为异步方法,为了更好的性能,会批量更新state,避免了频繁渲染,提高了性能,但是,setTimeout是异步方法,react无法直到开发者异步方法中想要渲染的顺序,所以在异步方法中调用setTimeout,react会即时渲染,不会使用批量更新。

react 在setState后立即获取state值的方法:
1.setState后使用回调获取

state = {
val:0
}

this.setState({
        val:this.state.val + 1
    },()=>{
        console.log(this.state.val) // 1
    })

2.使用prevState获取,setState() 可以接收一个函数,这个函数接受两个参数,第一个参数表示上一个状态值,第二参数表示当前的 props

this.setState((prevState, props) => ({
    //do something here
}));

this.setState((prevState, props) => ({
        val: prevState.val + 5  
 }))
console.log(this.state.val) // 1

3.使用上诉setTimeout获取

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值