react生命周期

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gHhFLoVI-1647932009614)(/Users/sans/Desktop/生命周期.png)]

在React的类组件中,官方为其提供了生命周期的概念组件的生命周期大抵分为三个阶段:挂载(mount)、更新(update)、卸载(unmount)。

挂载阶段:在组件初始化中执行且只执行一次

更新阶段:当props和state改变时触发零次或多次

卸载阶段:在组件销毁时执行且只执行一次x

挂载阶段中涉及到的生命周期

1、constructor

通过给this.state赋值对象来初始化内部state
将事件处理程序方法绑定到实例。

constructor(props) {super(props);this.state = { name:sans };this.initData = this.initData.bind(this);
}

ps:不要把props直接赋值给state,这样操作state不会随着props更新而变化。

在constructor中不要调用setState方法,直接给this.state赋值

2、static getDerivedStateFromProps(props, state)

getDerivedStateFromProps是一个静态方法,在挂载和更新阶段时调用,可以返回一个对象来更新状态或者返回null不更新。

可以通过此生命周期函数比较新的props和之前的state中的数据,查看是否变化,再去更新state。也可以不判断直接更新state值。

static getDetivedStateFromProps(props,state){const { name } = props;// 判断新的props和之前的state是否相同,如果改变就相应更新stateif( name != state.name) {return {name};}//否则不处理return null;
}

3、render

render是类组件中唯一必须实现的方法,在此方法中会检查props和state的变化并渲染react组件。

render(){return(<div><h1>Hello World</h1></div>)
}

4、componentDidMount

此方法在组件挂载完成后调用,适用于一些异步数据请求、设置定时器、dom节点初始化的操作,只会调用一次。

ps:1、如果在此方法中设置了setInterval、setTimeout记得在componentWillUnmount里清除掉!

2、在此方法可以直接调用setState,官网解释如下:

你可以在 componentDidMount()直接调用 setState()。它将触发额外渲染,但此渲染会发生在浏览器更新屏幕之前。如此保证了即使在 render() 两次调用的情况下,用户也不会看到中间状态。请谨慎使用该模式,因为它会导致性能问题。通常,你应该在 constructor() 中初始化 state。如果你的渲染依赖于 DOM 节点的大小或位置,比如实现 modals 和 tooltips 等情况下,你可以使用此方式处理

componentDidMount(){//设置定时器this.timer = setTimeout(() => {console.log('component did mount')}, 300);//获取异步数据this.initData();
}
更新阶段涉及到的生命周期

1、getDerivedStateFromProps

2、shouldComponentUpdate(nextProps, nextState)

在react很多场景下会造成react不必要的重新渲染,比如setState但是state的值其实没有变化,组件还是会rerender,而此时就会导致不必要的性能损耗。在这种场景下,就可以通过shouldComponentUpdate生命周期去优化代码。

该方法主要是将当前的props与nextProps比较,当前的state和nextState比较,如果返回false则可以跳过更新,但是该方法并不会阻止子组件在state中渲染,所以如果想在shouldComponentUpdate去阻止render,可能会产出bug。

shouldComponentUpdate(nextProps,nextState){//如果值没有变化,则返回false,跳过更新if(nextProps.name == this.props.name){//当返回false时,后续不会调用componentWIllUpdate、render、componentDidUpdate这几个函数//但是仍可能重新渲染return false}return true}

ps:在该生命周期中进行的是浅比较,并且不建议在其中进行深层比较或者使用JSON.stringfy(),会非常影响效率且损害性能

3、render

当组件的props、state变更时,或者强制更新时都会触发render方法,并且render函数是一个纯函数,在class组件中必须实现。

4、getSnapShotBeforeUpdate(prevProps, prevState)

这个生命周期也是react16.4之后新出的,会在最近的一次渲染之前调用,当我们想要获取render之前的dom状态时就可以使用该方法,并且该生命周期的任何返回值将变成参数传给componentDidUpdate。

看看官网的

react生命周期整理相关推荐

  1. 深入react技术栈(5):React生命周期

    我是歌谣 放弃很容易 但是坚持一定很酷 微信搜一搜前端小歌谣 React生命周期 挂载和卸载过程 组件得挂载 组件得卸载 数据更新过程 整体流程 文章参考深入学习React技术栈

  2. react学习(9)----react生命周期

    react生命周期1.1.constructor() constructor()中完成了React数据的初始化,它接受两个参数 :props和context,当想在函数内部使用这两个参数时 ,需使用s ...

  3. react生命周期(自己的方式理解)

    react生命周期(自己的方式理解) react的生命周期函数有:挂载,渲染/更新,卸载 首先要知道react生命周期最初始的要有哪些?最后生命中出现的又有哪些?我本人喜欢把react比作是一个人的一 ...

  4. 你不可不知道的React生命周期

    点小蓝字加关注! 作者:kim 来源:原创 写在前面 咱今天聊的话题是React生命周期,灵感来自于最近在网上发现一篇关于react生命周期的文章,里面记录的知识点竟然与小编所get到的有出入.作为一 ...

  5. ES6中的React生命周期详解

    太长时间没写react了,有点生.重新捡起来练练手. import React,{ Component } from 'react';class Demo extends Component {con ...

  6. react生命周期方法介绍

    react生命周期 react生命周期主要包括三个阶段:初始化阶段.运行中阶段.销毁阶段 react在不同的生命周期会触发不同的钩子函数 初始化阶段 getDefaultProps() 设置组件默认的 ...

  7. react生命周期详细介绍

    目录 挂载:在组件实例被创建并插入到dom中时,生命周期调用顺序如下 constructor componentWillMount getDerivedStateFromProps render co ...

  8. vue生命周期和react生命周期对比。

    生命周期 指的是组件从初始化开始到结束的过程 或者是生命周期是描述组件从开始到结束的过程,每个组件都具有生命周期,都对组件通过生命周期给予的钩子函数进行管理. 钩子函数 指的是系统某些状态和参数发生改 ...

  9. React、react生命周期、react生命周期运行过程、shouldComponentUpdate的用法

    React.react生命周期.react生命周期运行过程 1.创建阶段 constructor(){super()console.log('执行构造函数')this.state={num:1}}UN ...

最新文章

  1. Flask and Ajax Post HTTP/1.1 400
  2. Java基础——Servlet(六)分页相关
  3. JMeter3.0_插件管理
  4. 树莓派4B开机自动挂载移动硬盘,以及遇到the root account is locked问题
  5. 顶点计划一自行车组调查报告
  6. 《JavaScript高效图形编程(修订版)》——导读
  7. 7 vsphere 分配许可_vCenter server 5.5中添加ESXi5.5主机并分配许可密钥
  8. js:图片的切换(代码)
  9. PYTHON-音视频合并方法
  10. java table 增加行_使用POI给word中的表格增加行
  11. 11.25 AtCoder Beginner Contest 129
  12. Idea部署dubbo-admin
  13. 关于二重积分,三重积分的理解
  14. Python学习知识清单(基础+进阶)
  15. HAMA 混合信道接入Ad-Hoc,分布式TDMA 协议
  16. linux怎么取消文件隐藏命令,linux命令行下隐藏文件的操作
  17. 自动开关,每天写“日报......顺舟智能推动路灯“服务升级”
  18. mysql查询出的数据转换为数字,关于sql:在MySQL查询中将文本转换为数字
  19. 格式化JSON stringify 的使用
  20. rapidly exploring random tree(快速搜索随机树)路径规划

热门文章

  1. mysql 查询树形结构_MySql/Oracle树形结构查询
  2. 华为手机的商业模式以及网络营销的建议
  3. java悬浮窗锁定_怎么通过悬浮窗录音?再也不用担心文本被遮挡!
  4. flutter图片聊天泡泡_Flutter/dart聊天实例|仿微信界面|红包|朋友圈
  5. random.randint()与numpy.random.randint()的区别
  6. 2020计算机考研准备,2020年考研党大三时需要准备啥?看这3个问题
  7. 【业界偷懒】【Public】BZOJ题目一句话题解整理
  8. 电商运营:2020天猫618超级晚营销怎么玩?最新营销方案献上
  9. Lesson 4 An exciting trip 激动人心的旅行
  10. 关于13年手游的总结和14年的分析