setState

一、setState在哪?

setState存在于父组件Component上,每个自定义的组件继承之后都能调用。

二、为什么要使用setState

我们无法手动调用render,当我们使用setState时,react会自动帮我们调用render

setSate一定是异步的吗?

情况一:异步(在组件生命周期或React合成事件中)

  • setSate设计成异步,可以显著的提升性能:
    (1)如果每次调用setState都进行一次更新,那就意味着render函数会被频繁调用,界面会被重新渲染,这样的效率是很低的。
    (2)最好的办法是获得多个的更新,之后进行批量更新。

  • 如果同步更新了state,但是如果还没有执行render函数,state和props就不能保持同步:
    (1)如果state和props不能保持一致性,在开发中会产生很多问题。

如何拿到setState更新后的数据

  • 方法一:获取异步更新后的数据
this.setState({
	message:"hello React"
}, ()=>{console.log(this.state.message)})
  • 方法二:
componentDidupdate(){
	console.log(this.state.message)
} //该方法会在render之后被调用

比起方法一,方法二会先打印

情况二:同步(在setTimeout或原生DOM事件中)

  • 情况一:
setTimeout(()=>{
	this.setState({
	message:"hello React"
})
console.log(this.state.message)
})
  • 情况二:
<button id="btn">点击</button>
componentDidupdate(){
	document.getElementById("btn").addEventListenr('click',()=>{
		this.setState({
			message:"hello React"
		})
		console.log(this.state.message)
	})
} //该方法会在render之后被调用

react通过上下文的不同情况,来返回setState是同步还是异步(源码)


setState数据的合并

setState使用assign方法来进行数据合并

Object.assign({},prevState,partialState)

多次调用setState,只有最后一次会生效。
setState中传入函数,则会每次调用都生效

setState为什么最好不更新自身

当我们使用shouldComponentUpdate时,我们会比较原来的state和新的state,比较的时候,算法使用的是state中属性变量的内存地址的比较,如果我们更新原来的state作为新的state,那么新的state和旧的state的内存地址并没有发生变化,会导致shouldComponentUpdate更新失败。
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值