react之中的setState

为什么setState设置为异步?

在组件生命周期或者React合成时间之中,setState是异步的。(react之中的onClick、e…都是合成事件不是原生事件)
1、如果每次调用setState都进行一次更新,render函数会频繁调用,界面多次重新渲染,效率很低。异步之后获取多个更新,批量更新,题高性能。
2、如果把setState设置为同步,更新了state,还没有执行render函数,那么传送给子组件的state不能够保持同步,会产生一定的问题。

获取异步更新之后的数据

由于异步,下面进行输出的是原本的数据,不是修改之后的数据。

 this.setState({
 	num:99;
 })
 console.log(this.state.num);//输出原本数据不是99

1、this.setState的第二个参数进行获取
this.state(更新的state,回调函数)

 this.setState({
 	num:99;
 },()=>{
 	console.log(this.state.num);//输出数据是99
 })

2、componentDidUpdate()

componentDidUpdate(){
	console.log(this.state.num)
}

setState同步情况

同步异步还是需要根据具体情况进行:
1、在setTimeout中更新

change(){
	setTimeout(()=>{
		this.setState({
			num:99
		});
		console.log(this.state.num);//输出数据是99,最新更新的
	},0)
}

2、在原生的DOM事件中:
如果把下面代码放在addEventListener外部则又是异步事件。
按下面的代码是同步操作

componentDidMount(){
	const btn=document.getElementById("btn");
	btn.addEventListener('click',()=>{
	 	this.setState({
			num:99
		});
		console.log(this.state.num);//输出数据是99,最新更新的
	})
}

setState的合并

1、数据合并
原本的状态如下:

	this.state={
	name:jack,
	num:99
	}

其后更新状态:修改之后的状态变其中name覆盖,但是num依旧保留。

	this.setState({name:haoke})

原因是其中的机理是采用Object.assign,操作的大致如下

Object.assign({},this.state,{name:haoke})

2、setState自身的合并
以下情况自身被合并,num只在原本的值上加一

change(){
	this.setState({num:this.num+1});
	this.setState({num:this.num+1});
	this.setState({num:this.num+1});
}

每次执行如下:第一次返回的是{num:100},其后传入的两个参数对比都是一样的,都被合并了

Object.assign({},{num:99},{num:100})

3、setState合并时累加
当setStatec传入的是一个函数的时候,如下操作最后num加3

change(){
	this.setState((prevState,props)=>{
		return{
			num:prevState.num+1
		}
	});
	this.setState((prevState,props)=>{
		return{
			num:prevState.num+1
		}
	});
	this.setState((prevState,props)=>{
		return{
			num:prevState.num+1
		}
	});

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值