react新出来两个钩子函数是什么?和删掉的will系列有什么区别?

简介: react新出来两个钩子函数是什么?和删掉的will系列有什么区别?

附react的新旧生命周期图

旧版本



新版本


在react新版增加了两个钩子:getDerivedStateFromProps和getSnapshotBeforeUpdate

他们分别可以直译为:从props获取衍生的状态 – 更新之前获取快照值

用createReactApp快速创建一个案列解释一下新的两个钩子

图片:


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

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


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

当内部返回一个状态对象时:

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


并且点击按钮,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


总结:官方说道:此方法适用于罕见的用例,但是也得了解了解,在适当环境下也可以采用。

getSnapshotBeforeUpdate

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



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)
  }

点击按钮触发页面更新


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

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


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

相关文章
|
30天前
|
XML JavaScript 前端开发
Vue和React有什么区别
【8月更文挑战第28天】Vue和React有什么区别
182 0
|
3天前
|
前端开发 JavaScript 开发者
React 和 Vue.js 框架的区别是什么?
React 和 Vue.js 框架的区别是什么?
|
3天前
|
XML JavaScript 前端开发
学习react基础(1)_虚拟dom、diff算法、函数和class创建组件
本文介绍了React的核心概念,包括虚拟DOM、Diff算法以及如何通过函数和类创建React组件。
13 2
|
5天前
|
JavaScript 前端开发 算法
vue和react的区别是什么?
vue和react的区别是什么?
|
3天前
|
缓存 前端开发
React中函数式Hooks之memo、useCallback的使用以及useMemo、useCallback的区别
React中的`memo`是高阶组件,类似于类组件的`PureComponent`,用于避免不必要的渲染。`useCallback` Hook 用于缓存函数,避免在每次渲染时都创建新的函数实例。`memo`可以接收一个比较函数作为第二个参数,以确定是否需要重新渲染组件。`useMemo`用于缓存计算结果,避免重复计算。两者都可以用来优化性能,但适用场景不同:`memo`用于组件,`useMemo`和`useCallback`用于值和函数的缓存。
11 1
|
5天前
|
前端开发
react学习(22)高阶函数和函数柯里化
react学习(22)高阶函数和函数柯里化
|
1月前
|
前端开发
如何编写React函数组件
【8月更文挑战第17天】如何编写React函数组件
15 2
|
1月前
|
前端开发 JavaScript 开发者
React组件与JSX之间的区别是什么
【8月更文挑战第9天】 React组件与JSX之间的区别是什么
46 4
|
1月前
|
移动开发 前端开发 API
React路由和HTML5 History API有什么区别
【8月更文挑战第11天】React路由和HTML5 History API有什么区别
32 1
|
1月前
|
前端开发 JavaScript API
React 与 React Native 的主要区别
【8月更文挑战第7天】 React 与 React Native 的主要区别
162 3

热门文章

最新文章