1. 为什么要是用 setState
- 当我们希望通过点击一个按钮从而
改变一个文本时
,就需要使用到setState
方法 - 当我们调用setState时,会重新执行
render函数
,根据最新的State来创建ReactElement
对象;然后再根据最新的ReactElement对象,对DOM进行修改 - setState方法是从
Component
中继承过来的
2. 对象式的setState
- 语法:
setState(stateChange, [callback])
- stateChange为状态改变对象(该对象可以体现出
状态的更改
) - callback是可选的
回调函数
, 它在状态更新完毕、界面也更新后(render调用后)才被调用
- stateChange为状态改变对象(该对象可以体现出
案例:点击加1进行说明
- App组件
import React, { Component } from 'react'
import Demo from './components/Demo'
export default class App extends Component {
render() {
return (
<div>
<Demo/>
</div>
)
}
}
- Demo组件
import React, { Component } from 'react'
export default class Demo extends Component {
state = { count: 0 }
add = () => {
// 1. 获取原来的count值
const { count } = this.state
// 2. 更新状态
this.setState({
count: count + 1
})
console.log(this.state.count);
}
render() {
return (
<div>
<h1>当前和为:{this.state.count}</h1>
<button onClick={this.add}>点我加1</button>
</div>
)
}
}
- 页面为1,状态是0; 页面为2,状态是1
- 因为setState是一个
同步的方法
,但是setState引起React后续更新状态的动作是异步的
如果想在更新完状态后拿到该状态,应该在回调中执行
add = () => {
//1.获取原来的count值
const { count } = this.state
//2.更新状态
this.setState({ count: count + 1 }, () => {
console.log(this.state.count);
})
}
3. 函数式的setState
-
语法:
setState(updater, [callback])
1.updater为返回stateChange
对象的函数。
2.updater可以接收到state和props
。
3.callback是可选的回调函数
, 它在状态更新、界面也更新后(render调用后)才被调用。 -
App组件
export default class App extends Component {
render() {
return (
<div>
<Demo x={100} />
</div>
)
}
}
- Demo组件
add = () => {
// 函数式的setState
this.setState((state, props) => {
console.log(state, props);
return {count:state.count+1}
})
}
- 简写
// 简写
this.setState(state => ({count:state.count+1}))
4. 总结
1.对象式的setState是函数式的setState的简写方式(语法糖)
2.使用原则:
(1).如果新状态不依赖于原状态 ===> 使用对象方式
(2).如果新状态依赖于原状态 ===> 使用函数方式
(3).如果需要在setState()执行后获取最新的状态数据, 要在第二个callback函数读取