react17 生命周期场景解释

 

一、废除的生命周期
官网文档指出使用这些生命周期的代码会在未来版本的react中更容易产生bug,尤其是对于异步渲染的版本
由于未来采用异步渲染机制,所以即将在17版本中去掉的生命周期钩子函数
componentWillMount
componentWillRecieveProps
componentWIllUpdate

二、新增的生命周期
static getDerivedStateFromProps(nextProps, prevState) {}
用于替换componentWillReceiveProps,可以用来控制 props 更新 state 的过程;它返回一个对象表示新的 state;如果不需要更新,返回 null 即可
在每次渲染之前都会调用,不管初始挂载还是后面的更新都会调用,这一点和componentWillReceiveProps不同(只有当父组件造成重新渲染时才调用
简单的理解就说从props中获取state,这个生命周期的功能实际上就是将传入的props映射到state上面
getDerivedStateFromProps是一个静态函数,也就是这个函数不能通过this访问到class的属性,也并不推荐直接访问属性。而是应该通过参数提供的nextProps以及prevState来进行判断,根据新传入的props来映射到state
如果props传入的内容不需要影响到你的state,那么就需要返回一个null,这个返回值是必须的,所以尽量将其写到函数的末尾
getSnapshotBeforeUpdate() {}
在最近的更改被提交到DOM元素前,使得组件可以在更改之前获得当前值,此生命周期返回的任意值都会传给componentDidUpdate()。
用于替换 componentWillUpdate,该函数会在update后 DOM 更新前被调用,用于读取最新的 DOM 数据,返回值将作为 componentDidUpdate 的第三个参数
在最新的渲染数据提交给DOM前会立即调用,它让你在组件的数据可能要改变之前获取他们
componendDidCatch(error, info)
如果一个组件定义了componentDidCatch生命周期,则他将成为一个错误边界(错误边界会捕捉渲染期间、在生命周期方法中和在它们之下整棵树的构造函数中的错误,
就像使用了try catch,不会将错误直接抛出了,保证应用的可用性)

三、下面来看看实际应用场景分析:

/* * @Descripttion: react17 生命周期测试 * @version: * @Author: lhl * @Date: 2021-03-04 14:51:12 * @LastEditors: lhl * @LastEditTime: 2021-03-26 18:46:49 */ import React, { Component } from 'react' import PropTypes from 'prop-types' // prop代表父组件传递过来的值,types代表类型 简单来说就是用来校验父组件传递过来值的类型 // 类组件 /* 1.挂载时顺序 constructor() --> static getDerivedStateFromProps(props, state) --> render() --> componentDidMount() 2.更新时顺序 static getDerivedStateFromProps(props, state) --> shouldComponentUpdate() --> render() --> static getSnapshotBeforeUpdate(prevProps, prevState) --> componentDidUpdate() 3.卸载 (比如页面切换) componentWillUnmount() 在 Fiber 机制下,render 阶段是允许暂停、终止和重启的。废弃的生命周期钩子函数,它们都处于render阶段,都可能被重复执行 在 componentWillReceiveProps 和 componentWillUpdate 里滥用 setState 导致重复渲染死循环的 forceUpdate(callback) - 组件强制更新,会跳过shouldComponentUpdate */ export default class LifeCycle extends Component { // constructor()用来做一些组件的初始化工作,如定义this.state的初始内容 为事件处理函数绑定实例 constructor(props){ // super(props)用来调用基类的构造方法( constructor() ), 也将父组件的props注入给子组件,供子组件读取(组件中props只读不可变,state可变) super(props) this.state = { count: 0 } console.log('constructor') } // static propTypes = { // prop: PropTypes // react里的defaultProps来设置默认的props值 // } static getDerivedStateFromProps(props, state){ console.log(props, state,'getDerivedStateFromProps') return true } componentDidMount(){ console.log('componentDidMount') } // 根据更新后的state或props判断是否重新渲染DOM,返回值为布尔值,常用来性能优化 /** * 判断是否需要更新视图,执行后面的render方法 * 1. 如果返回 false ,则不需要执行后面的render方法,视图也不会改变 * 2. 返回true, 需要执行render方法,视图也会对应的改变 */ // 下一个和当前状态对比 nextState === this.state.xxx 没有变化就 return false 否则 true shouldComponentUpdate(nextProps, nextState){ console.log(nextProps, nextState, 'shouldComponentUpdate') return true } // 该函数会在update后 DOM 更新前被调用,用于读取最新的 DOM 数据,返回值将作为 componentDidUpdate 的第三个参数 getSnapshotBeforeUpdate(prevProps, prevState){ console.log(prevProps, prevState,'getSnapshotBeforeUpdate') return true } // state或props更新后调用 componentDidUpdate(props, state, snapshot){ console.log(props, state, snapshot,'componentDidUpdate') } // 组件销毁或卸载时调用 componentWillUnmount(){ console.log('componentWillUnmount') } // 错误处理 // 后代组件跑出错误时调用,并返回一个值以更新state static getDerivedStateFromError(callback){ console.log(callback) } // 后代组件抛出错误后调用,参数info包含有关组件错误的栈信息 componentDidCatch(error, info){ console.log(error, info) } handleChange = () => { this.setState({ count: 12 }) } // 渲染React组件 PureComponet 和 shouldComponentUpdate 处理渲染性能优化问题 // 初始化 // setState()在任何情况下都会导致组件的重新渲染,即使state未发生变化 // 只要父组件重新渲染了,那么子组件就会重新渲染 render() { console.log('render') const { count } = this.state return ( <div> <h1>react 17 生命周期</h1> <button onClick={this.handleChange}>更改状态{count}</button> </div> ) } } LifeCycle.propTypes = { name: PropTypes.string };

未经允许,请勿随意转载!!谢谢合作!!!


__EOF__

本文作者蓝色帅-橙子哥
本文链接https://www.cnblogs.com/lhl66/p/14583735.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   鱼樱前端  阅读(520)  评论(1编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· Open-Sora 2.0 重磅开源!
· 周边上新:园子的第一款马克杯温暖上架
历史上的今天:
2018-03-26 git项目常用命令
 
拂雪 - 不才
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.
  1. 1 往后余生 王贰浪
  2. 2 拂雪 不才
  3. 3 我的一个道姑朋友 洛尘鞅
  4. 4 大田后生仔 王雨萌
点击右上角即可分享
微信分享提示