React.Component(V16.8.6)

组件的生命周期

挂载

当组件实例被创建并插入 DOM 中时,其生命周期调用顺序如下:

  • constructor()
  • static getDerivedStateFromProps()
  • render()
  • componentDidMount()

componentWillMount() 之后将废弃

更新

当组件的 props 或 state 发生变化时会触发更新。组件更新的生命周期调用顺序如下:

  • static getDerivedStateFromProps()
  • shouldComponentUpdate()
  • render()
  • getSnapshotBeforeUpdate()
  • componentDidUpdate()

componentWillUpdate() 、 componentWillReceiveProps() 之后将被废弃

卸载

当组件从 DOM 中移除时会调用如下方法:

  • componentWillUnmount()

错误处理

当渲染过程,生命周期,或子组件的构造函数中抛出错误时,会调用如下方法:

  • static getDerivedStateFromError()
  • componentDidCatch()

组件还提供了一些额外的 API:

  • setState()
  • forceUpdate()

单独介绍

getDerivedStateFromProps

这个生命周期函数是为了替代 componentWillReceiveProps 存在的,所以在你需要使用componentWillReceiveProps的时候,就可以考虑使用getDerivedStateFromProps来进行替代了。

两者的参数不相同的,而getDerivedStateFromProps是一个静态函数,也就是这个函数不能通过this访问到class的属性,也并不推荐直接访问属性。

而是应该通过参数提供的nextProps以及prevState来进行判断,根据新传入的props来映射到state。

需要注意的是,如果props传入的内容不需要影响到你的state,那么就需要返回一个null,这个返回值是必须的,所以尽量将其写到函数的末尾。

static getDerivedStateFromProps(nextProps, prevState) {const {type} = nextProps;// 当传入的type发生变化的时候,更新stateif (type !== prevState.type) {return {type,};}// 否则,对于state不进行任何操作return null;
}

如果你的组件内部既需要修改自己的type,又需要接收从外部修改的type。

static getDerivedStateFromProps(nextProps, prevState) {const {type} = nextProps;// type可能由props驱动,也可能由state驱动,这样判断会导致state驱动的type被回滚if (type !== prevState.type) {return {type,};}// 否则,对于state不进行任何操作return null;
}

在非必须的时候,摒弃这种写法。type要么由props驱动,要么完全由state驱动。

如果实在没有办法解耦,那么就需要一个hack来辅助:绑定props到state上。

constructor(props) {super(props);this.state = {type: 0,props,}
}
static getDerivedStateFromProps(nextProps, prevState) {const {type, props} = nextProps;// 这段代码可能看起来非常混乱,这个props可以被当做缓存,仅用作判断if (type !== props.type) {return {type,props: {type,},};}// 否则,对于state不进行任何操作return null;
}

上面的代码可以保证在进行多数据源驱动的时候,状态能够正确改变。当然,这样的代码很多情况下是会影响到别人阅读你的代码的,对于维护造成了非常大的困难。

getSnapshotBeforeUpdate(prevProps, prevState)

getSnapshotBeforeUpdate() 在最近一次渲染输出(提交到 DOM 节点)之前调用。它使得组件能在发生更改之前从 DOM 中捕获一些信息(例如,滚动位置)。此生命周期的任何返回值将作为参数传递给 componentDidUpdate()。

此用法并不常见,但它可能出现在 UI 处理中,如需要以特殊方式处理滚动位置的聊天线程等。

应返回 snapshot 的值(或 null)。

class ScrollingList extends React.Component {constructor(props) {super(props);this.listRef = React.createRef();}getSnapshotBeforeUpdate(prevProps, prevState) {// 我们是否在 list 中添加新的 items ?// 捕获滚动位置以便我们稍后调整滚动位置。if (prevProps.list.length < this.props.list.length) {const list = this.listRef.current;return list.scrollHeight - list.scrollTop;}return null;}componentDidUpdate(prevProps, prevState, snapshot) {// 如果我们 snapshot 有值,说明我们刚刚添加了新的 items,// 调整滚动位置使得这些新 items 不会将旧的 items 推出视图。//(这里的 snapshot 是 getSnapshotBeforeUpdate 的返回值)if (snapshot !== null) {const list = this.listRef.current;list.scrollTop = list.scrollHeight - snapshot;}}render() {return (<div ref={this.listRef}>{/* ...contents... */}</div>);}
}

在上述示例中,重点是从 getSnapshotBeforeUpdate 读取 scrollHeight 属性,因为 “render” 阶段生命周期(如 render)和 “commit” 阶段生命周期(如 getSnapshotBeforeUpdate 和 componentDidUpdate)之间可能存在延迟。

Error boundaries

Error boundaries 是 React 组件,它会在其子组件树中的任何位置捕获 JavaScript 错误,并记录这些错误,展示降级 UI 而不是崩溃的组件树。Error boundaries 组件会捕获在渲染期间,在生命周期方法以及其整个树的构造函数中发生的错误。

如果 class 组件定义了生命周期方法 static getDerivedStateFromError()componentDidCatch() 中的任何一个(或两者),它就成为了 Error boundaries。通过生命周期更新 state 可让组件捕获树中未处理的 JavaScript 错误并展示降级 UI。

仅使用 Error boundaries 组件来从意外异常中恢复的情况;不要将它们用于流程控制。

static getDerivedStateFromError(error)

此生命周期会在后代组件抛出错误后被调用。 它将抛出的错误作为参数,并返回一个值以更新 state

class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {// 更新 state 使下一次渲染可以显降级 UIreturn { hasError: true };}render() {if (this.state.hasError) {// 你可以渲染任何自定义的降级  UIreturn <h1>Something went wrong.</h1>;}return this.props.children; }
}

注意:getDerivedStateFromError() 会在渲染阶段调用,因此不允许出现副作用。 如遇此类情况,请改用 componentDidCatch()。

componentDidCatch(error, info)

componentDidCatch() 会在“提交”阶段被调用,因此允许执行副作用。 它应该用于记录错误之类的情况:

class ErrorBoundary extends React.Component {constructor(props) {super(props);this.state = { hasError: false };}static getDerivedStateFromError(error) {// 更新 state 使下一次渲染可以显示降级 UIreturn { hasError: true };}componentDidCatch(error, info) {// "组件堆栈" 例子://   in ComponentThatThrows (created by App)//   in ErrorBoundary (created by App)//   in div (created by App)//   in ApplogComponentStackToMyService(info.componentStack);}render() {if (this.state.hasError) {// 你可以渲染任何自定义的降级 UIreturn <h1>Something went wrong.</h1>;}return this.props.children; }
}

setState的异步操作

因为setState是异步的,所有有时setState后获取this.state数据并不准确,可以如下操作:

state = {name:'initName'
}this.setState((state,props)=>{console.log(state,props);return {name:'name-change'};
})const {name}=this.state;
this.setState({name:'name-change'},()=>{console.log(this.state.name,name)   // name-change initName
})

官方文档:https://zh-hans.reactjs.org/docs/react-component.html#static-getderivedstatefromprops

转载于:https://www.cnblogs.com/adoctors/p/10976931.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/277566.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql date类型加一个月jdbc_JDBC操作数据库Date类型数据

JDBC操作数据库Date类型数据由于java原生的工具类java.util提供的Date对象与JDBC提供的Date对象并不相同分别是java.util.Date和java.sql.Datejava.sql.Date是java.util.Date的子类所以在进行增删改查部分操作中&#xff0c;不能直接将原生工具类的Date对象直接运用到JDBC中可以…

使用深度学习TensorFlow框架进行图片识别

Apsara Clouder大数据专项技能认证&#xff1a;使用深度学习TensorFlow框架进行图片识别本认证系统的介绍了深度学习的一些基础知识&#xff0c;以及Tensorflow的工作原理。通过阿里云机器学习PAI基于经典的CIFAR-10数据集实现图片识别。学员可以通过本实验&#xff0c;对深度学…

删除开发分支 新建另一个开发分支

//查看状态 git status //查看分支 会有一个分支git branch -d wlh-dev git branch //删除wlh-dev 分支 git branch -d wlh-dev //再次查看分支 git branch //拉代码 git pull //查看状态 git status //新分支创建的同时切换分支 git checkout -b wlh-dev1222 //…

ES语法及-IK分词器

{"query": {"query_string": {"default_field": "title",//全文搜索"query": "器大"}} } "id":1, "title":"Elasticsearch是一个基于Lucene的搜索服务器", "content":&q…

Git仓库配置

安装git依赖包 yum -y install curl-devel expat-devel gettext-devel openssl-devel zlib-devel gcc perl-ExtUtils-MakeMaker 源码安装 wget https://github.com/git/git/archive/v2.7.4.zip unzip v2.7.4.zip cd git-2.7.4 make prefix/usr/local/git all make prefix/usr/l…

python3 tkinter电子书_Python3 Tkinter-Text

1.创建from tkinter import *rootTk()tText(root)t.pack()root.mainloop()2.添加文本from tkinter import *rootTk()tText(root)t.insert(1.0,0123456789)t.insert(1.0,ABDCEFGHIJ)t.pack()root.mainloop()3.设置添加位置from tkinter import *rootTk()tText(root)for i in ran…

问题 1: 区间交集

问题 1: 区间交集 题目描述 输入 5 个正整数 a1、b1、a2、b2 和 c&#xff0c;如果 c 在区间[a1, b1]内 并且 c 也在区间[a2, b2]内&#xff0c;输出”in”&#xff0c;否则输出”out”。 注意&#xff1a;方括号表示的是闭区间&#xff0c;[a, b]是包括 a 和 b 的。 输入 一行…

python倒三角形粉色填充笔的形状海龟_Python001-Turtle(海龟绘图)详解

一、简介Turtle库是Python语言中的一个绘制图像的函数库。详细文档&#xff1a; https://docs.python.org/zh-cn/3/library/turtle.html二、使用1.画布设置(canvas)(1)设置画布大小turtle.screensize(canvwidthNone, canvheightNone, bgNone)参数分别为画布的宽(单位像素), 高,…

Python 提取数据库(Postgresql)并邮件发送

刚入门python&#xff0c;发现确实是一个不错的语言。业务部门要求将将某一个数据库中的表&#xff0c;定期发送到相关部门人员邮箱。其实整个业务需求很简单&#xff0c;实现起来也不难。但是由于刚入门python&#xff0c;所以还是借鉴了不上网上的内容&#xff0c;也得到了许…

4.Python的不堪一击到初学乍练(列表,元组)

Python(列表,元组) 一.列表 列表初识 列表是python的基础数据类型之一,其他编程语言也有类似的数据类型. 比如JS中的数组, java中的数组等等,它是以[ ]括起来, 每个元素用","隔开并且可以存放各种数据类型.列表相比于字符串,不仅可以存放不同的数据类型,并且可以存放…

【前端工程师手册】说清楚JavaScript中的相等性判断

有哪些判断相等性的方法 JavaScript现在提供了三种方法来判断相等性&#xff1a; &#xff0c;三个等号即严格相等&#xff0c;两个等号即宽松相等Object.is()&#xff0c;ES6中用来判断相等的方法判断相等性的细节 &#xff08;严格相等&#xff09; 被比较的两个数不会进行类…

python多任务编程_python线程的多任务编程

多任务多任务介绍对于人来说&#xff0c;一边听歌&#xff0c;一边跳舞就是多任务。对于电脑&#xff0c;简单的说&#xff0c;同一时间执行多个程序处理数据叫做多任务多任务理解单核CPU单核cpu在处理多任务的时候是根据时间片轮转的方式进行的&#xff0c;比如执行QQ1us&…

列举python的5个数据类型_python公开课|新公布的5个python核心数据类型,这些细节你难道还不不知道吗...

【摘要】在这个科学技术高速发展的时代&#xff0c;越来越多的人都开始选择学习编程软件&#xff0c;那么首先被大家选择的编程软件就是python&#xff0c;也用在各行各业之中&#xff0c;并被大家所熟知&#xff0c;所以也有越来越多的python学习者关注python就业方向问题&…

selenium3 + python - page_source页面源码

前言&#xff1a; 有时候通过元素的属性的查找页面上的某个元素&#xff0c;可能不太好找&#xff0c;这时候可以从源码中爬出想要的信息。selenium的page_source方法可以获取到页面源码。 本次以博客园为例&#xff0c;先爬取页面源码&#xff0c;通过re正则表达式爬取出url&a…

简单分析Guava中RateLimiter中的令牌桶算法的实现

为什么80%的码农都做不了架构师&#xff1f;>>> 令牌桶算法是网络流量整形&#xff08;Traffic Shaping&#xff09;和速率限制&#xff08;Rate Limiting&#xff09;中最常使用的一种算法。典型情况下&#xff0c;令牌桶算法用来控制发送到网络上的数据的数目&am…

gcc oracle mysql_Linux下C语言访问Oracle数据库Demo

前提条件1. Linux环境已经存在&#xff0c;安装好了Oracle本demo 运行环境本地环境 RedHat LINUX AS 4 ,ORACLE 10G本地数据库sid orcl,ip:127.0.0.1,用户名:kingbi&#xff0c;密码&#xff1a;kingbi,表dsd_test. 显示表dsd_test 的所有记录.步骤&#xff1a;(1) 创建表 …

炼数成金数据分析课程---16、机器学习中的分类算法(交叉内容,后面要重点看)...

炼数成金数据分析课程---16、机器学习中的分类算法&#xff08;交叉内容&#xff0c;后面要重点看&#xff09; 一、总结 一句话总结&#xff1a; 大纲实例快速学习法 主要讲解常用分类算法(如Knn、决策树、贝叶斯分类器等)的原理及python代码实现 1、什么是分类&#xff1f; 分…

NFS配置详解

1、NFS服务介绍1.1 什么是NFS&#xff1f;NFS是Network File System的缩写。中文意思是网络文件系统。它的主要功能是通过网络&#xff08;一般是局域网&#xff09;让不同的主机系统之间可以共享文件或者目录。NFS客户端&#xff08;一般为应用服务器&#xff0c;例如web&…

idea用法

更新gradle的依赖后&#xff0c;刷新项目引入jar包的方法&#xff1a; view--Tool Buttons 在右侧 Gradle 点刷新 转载于:https://www.cnblogs.com/z360519549/p/10994897.html

linux备份mysql需要暂停服务吗_【MySQL运维】线上MySQL数据库停服迁移流程

一、数据备份与恢复阶段&#xff0c;选在凌晨1点进行操作&#xff0c;暂停服务进行备份(允许停服2个小时)1、首先停止Nginx服务&#xff0c;并且修改数据库用户密码&#xff0c;防止还有新的连接进来2、杀掉某个用户所有进程for i in mysql -udba -pPASSWORD -ssse "show …