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之间,既在页面完成渲染之前触发,比如获取滚动位置。这个钩子还是比较常用的。

相关文章
|
1月前
|
前端开发 开发者
React 函数组件与类组件对比
【10月更文挑战第4天】本文详细比较了React中的函数组件与类组件。函数组件是一种简单的组件形式,以纯函数的形式返回JSX,易于理解与维护,适用于简单的UI逻辑。类组件则是基于ES6类实现的,需要重写`render`方法并能利用更多生命周期方法进行状态管理。文章通过示例代码展示了两者在状态管理与生命周期管理上的差异,并讨论了常见的问题如状态更新异步性与生命周期管理的复杂性,最后给出了相应的解决方法。通过学习,开发者可以根据具体需求选择合适的组件类型。
55 8
|
4天前
|
JavaScript 前端开发 算法
React 框架和 Vue 框架的区别是什么?
React框架和Vue框架都是目前非常流行的前端JavaScript框架,它们在很多方面存在区别
|
17天前
|
JavaScript 前端开发 算法
在性能上,React和Vue有什么区别
【10月更文挑战第23天】在性能上,React和Vue有什么区别
14 1
|
23天前
|
前端开发 JavaScript UED
react-router 里的 Link 标签和 a 标签有什么区别
`react-router` 中的 `Link` 标签与 HTML 中的 `a` 标签的主要区别在于:`Link` 是专门为 React 应用设计的,用于实现客户端路由导航,不会触发页面的重新加载,而 `a` 标签则会刷新整个页面。使用 `Link` 可以提升应用的性能和用户体验。
|
30天前
|
前端开发 开发者 UED
React 18 与之前版本的主要区别
【10月更文挑战第12天】 总的来说,React 18 的这些区别体现了 React 团队对于提升应用性能、用户体验和开发效率的持续努力。开发者需要适应这些变化,充分利用新特性来构建更出色的应用。同时,随着技术的不断发展,React 也将继续演进,为开发者带来更多的创新和便利。
|
17天前
|
开发框架 JavaScript 前端开发
React和Vue之间的区别是什么
【10月更文挑战第23天】React和Vue之间的区别是什么
13 0
|
17天前
|
JavaScript 前端开发 Android开发
React和Vue之间的区别是什么
【10月更文挑战第23天】React和Vue之间的区别是什么
12 0
|
2月前
|
前端开发 JavaScript 开发者
React 和 Vue.js 框架的区别是什么?
React 和 Vue.js 框架的区别是什么?
|
2月前
|
前端开发 JavaScript 区块链
react18函数组件+antd使用指南-使用代码集合以及报错记录汇总
本文介绍了多个React开发中常见的问题及其解决方案,包括但不限于:1)`useForm`实例未连接到任何`Form`元素的警告及解决方法;2)监听页面滚动事件的实现方式;3)React 18与antd 5.8.6中定制主题的方法;4)React结合antd 4.x版本自定义主题色的步骤;5)解决`ResizeObserver loop`相关报错的技巧;6)处理React设计表单时遇到的CDN资源加载失败问题;7)解决onClick事件传参问题;8)修复类型错误等。每部分均提供详细分析与实用代码示例,帮助开发者快速定位并解决问题。
45 2
|
30天前
|
存储 前端开发 JavaScript
React useState 和 useRef 的区别
本文介绍了 React 中 `useState` 和 `useRef` 这两个重要 Hook 的区别和使用场景。`useState` 用于管理状态并在状态变化时重新渲染组件,适用于表单输入、显示/隐藏组件、动态样式等场景。`useRef` 则用于在渲染之间保持可变值而不触发重新渲染,适用于访问 DOM 元素、存储定时器 ID 等场景。文章还提供了具体的代码示例,帮助读者更好地理解和应用这两个 Hook。
35 0