Day8. React中的setState及更新机制看这篇就够了

2020-06-24  本文已影响0人  JackLeeVip

至关重要的知识点, 关系到能不能写出高效率的代码

为什么使用setState

修改了数据, 但是没有页面刷新, React不知道自己要刷新.png 报了一个警告.png
this.setState({
  counter : this.state.counter + 1
})

setState异步更新

如何获取异步的结果

// 方式一: 获取异步更新后的数据
// setState(更新的state, 回调函数)
this.setState({
  message: "你好哇, 李银河"
}, () => {
  console.log(this.state.message);
})

// 方式二: 生命周期函数, 获取异步更新的state
componentDidUpdate() {
  console.log(this.state.message);
}

有些情况下setState是同步更新的

情况二.png

setState一定是异步吗?

image.png

setState数据的合并

this.state = {
  message: "Hello World",
  name: coderwhy
}

// 源码中的操作
Object.assign({}, this.state, {message: "你好哇, 李银河"})

setState本身的合并

increment() {
  this.setState({
    counter: this.state.counter + 1
  })
  this.setState({
    counter: this.state.counter + 1
  })
  this.setState({
    counter: this.state.counter + 1
  })
}
源码, 每次合并都是一样的.png
this.setState((prevState, props) => {
  return {
    counter: prevState.counter + 1
  }
});
this.setState((prevState, props) => {
  return {
    counter: prevState.counter + 1
  }
});
this.setState((prevState, props) => {
  return {
    counter: prevState.counter + 1
  }
});
把前一次的值传到里面.png

React更新机制

情况一: 对比不同类型的元素

情况二: 对比同一类型的元素

image.png
image.png
同类型的组件元素.png

情况三: 对子节点进行递归

对子节点进行递归.png image.png

keys的优化

render函数被调用

shouldComponentUpdate

做一个判断.png

PureComponent

image.png 浅层比较.png 浅层比较源码.png

=> memo的使用

image.png
const MemoHeader = memo(function Header() {})

coderwhy的React核心技术与开发实战课程链接

少年~来做同学呀~.png
上一篇 下一篇

猜你喜欢

热点阅读