1. 对象式的setState

setState(stateChange, [callback])-——-对象式的setState

  • stateChange为状态改变对象(该对象可以体现出状态的更改)
  • callback是可选的回调函数, 它在状态更新完毕、界面也更新后(render调用后)才被调用 ```javascript import React, { Component } from ‘react’

export default class Demo extends Component { state = { count:0 } add = () => { const {count} = this.state this.setState({ count: count + 1 },() => { // 如果需要打印最新的值,相当于vue中的nextTick / 此处的回调函数执行机制: 先执行setState,然后执行render,最后执行此处的回调, 所以能拿到最新的值 / console.log(‘newtCount’,this.state.count) }) console.log(‘oldCount’,this.state.count) //打印的还是旧的值,
} render() { return (

我是Demo组件:{this.state.count}

) } }

  1. 因为setState是异步执行的, 所以先打印oldCount,然后打印newCount
  2. <a name="IG9BZ"></a>
  3. ## 2. 函数式的setState
  4. **setState(updater, [callback])**------函数式的setState
  5. - updater为返回stateChange对象的函数。
  6. - updater可以接收到stateprops
  7. - callback是可选的回调函数, 它在状态更新、界面也更新后(render调用后)才被调用。
  8. ```javascript
  9. import React, { Component } from 'react'
  10. export default class Demo extends Component {
  11. state = {
  12. count:0
  13. }
  14. add = () => {
  15. this.setState((state,props) => {
  16. // console.log(state,props);
  17. return {
  18. count:state.count + 1
  19. }
  20. },() => {
  21. console.log(this.state.count) //最新的值
  22. })
  23. }
  24. //下面是优化后的代码
  25. add = () => {
  26. this.setState(state =>({count:state.count + 1}))
  27. }
  28. render() {
  29. return (
  30. <div>
  31. <h2>我是Demo组件:{this.state.count}</h2>
  32. <button onClick={this.add}>+</button>
  33. </div>
  34. )
  35. }
  36. }

3. 总结

  • 对象式的setState是函数式的setState的简写方式(语法糖)
  • 使用原则:
    • 如果新状态不依赖于原状态 ===> 使用对象方式
    • 如果新状态依赖于原状态 ===> 使用函数方式
    • 如果需要在setState()执行后获取最新的状态数据,
    • 要在第二个callback函数中读取