React新版本增加的两个生命周期钩子

780 阅读2分钟
附react的新旧生命周期图

旧版本

src=http___img-blog.csdnimg.cn_20210201152339697.png_x-oss-process=image_watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80NjI2MTMwOQ==,size_16,color_FFFFFF,t_70&refer=http___im.jfif 新版本

src=http___upload-images.jianshu.io_upload_images_5098241-10770cb6c6743070.png&refer=http___upload-images.jianshu.jfif 在react新版增加了两个钩子:getDerivedStateFromProps和getSnapshotBeforeUpdate

他们分别可以直译为:从props获取衍生的状态 -- 更新之前获取快照值 用createReactApp快速创建一个案列解释一下新的两个钩子

image.png

getDerivedStateFromProps

app.js组件上新增一个按钮和一个状态值,点击按钮使得count + 1。 接下来引入getDerivedStateFromProps钩子

getDerivedStateFromProps() {
    console.log('00000000000000')
  }

当这样写这个钩子后,和我们写的普通函数没什么区别,会报错

image.png 根据错误信息,可见这个钩子前面得加static关键字,这说明,不是给实例使用的,而是类自身调用的。并且这个钩子内部必须有返回值,返回值是一个state状体对象(返回的对象和组件的state的key:value;保持一致)或者返回null。 当内部返回一个状态对象时:

state = {
    count: 0
  }
  static getDerivedStateFromProps() {
    return {
      count: 100
    }
  }

image.png 并且点击按钮,count不再 + 1,返回的状态对象影响到了页面的更新(看新版本钩子图可知,它在render前面),并且以返回的状态对象为主。 getDerivedStateFromProps钩子有2个参数,可以拿到组件传递的props和当前的组件状态。

state = {
    count: 0
  }
  static getDerivedStateFromProps(props,state) {
    return props;
  }
  
  // index.js组件传递props
  ReactDOM.render(
  <React.StrictMode>
    <App count='200' />
  </React.StrictMode>,
  document.getElementById('root')
);

此时页面count变为了200 image.png 总结:官方说道:此方法适用于罕见的用例,但是也得了解了解,在适当环境下也可以采用。

getSnapshotBeforeUpdate

在引入getSnapshotBeforeUpdate之后,再引入componentDidUpdate钩子。否则报错

image.png image.png getSnapshotBeforeUpdate有两个参数,分别是上个props上个state,暂时先返回null。

state = {
    count: 0
  }
  // static getDerivedStateFromProps(props) {
  //   return props;
  // }
  getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log(prevProps, 'prevProps')
    console.log(prevState, 'prevState')
    return null;
  }
  componentDidUpdate(prevProps,prevState) {
    console.log(prevProps,prevState)
  }

点击按钮触发页面更新

image.png 在getSnapshotBeforeUpdate钩子中返回一个存在的值,就可以在componentDidUpdate钩子的第三个参数接到。

getSnapshotBeforeUpdate(prevProps, prevState) {
    console.log(prevProps, 'prevProps')
    console.log(prevState, 'prevState')
    return 'Faker';
  }
componentDidUpdate(prevProps,prevState,c) {
    console.log(prevProps,prevState,c)
}

image.png 总结:因为getSnapshotBeforeUpdate在render和componentDidUpdate之间,既在页面完成渲染之前触发,比如获取滚动位置。这个钩子还是比较常用的。