React 生命周期,对比vue学习

所谓生命周期就是代码被读取到的那一刻到页面渲染完成的历程

react 的生命周期相比较 vue 会显得复杂点

钩子链接: https://projects.wojtekmaj.pl/react-lifecycle-methods-diagram/

 

整个过程被分成了三部分:挂载时更新时卸载时

1.挂载时

挂载时有个 constructor,这不是类中的构造器吗,然后 render 不是类编程中的函数吗,下面简单写一个类组件

import React, { Component } from 'react'

export default class Life extends Component {

  constructor () {
    super()
    console.log('组件开始加载');
    this.name = 'Dolphin'
  }

  componentDidMount() {
    console.log('组件挂载完成');
  }

  render() {
    console.log('组件开始被编译');
    return (
      <div>
        {this.name}
      </div>
    )
  }
}

挂载时:先执行 constructor ,此时就是获得数据源,再执行 render 渲染,编译得到虚拟 dom,中间穿插了个更新 DOMrefs最后执行 componentDidMount,这个 did 就是过去时,因此就是 vue 中的 onMounted,挂载完成。

更新 dom 不是生命周期,只是这个过程在这里发生

render 的目的是生成虚拟 dom,这个时候可以拿到 dom,但是值是空的,下面展示下,先引入 createRef 函数拿到 h4 的 dom,如下

import React, { Component, createRef } from 'react'

export default class Life extends Component {

  constructor () {
    super()
    console.log('组件开始加载', this.ref);
    this.name = 'Dolphin'
    this.ref = createRef() // 存放dom
  }

  componentDidMount() {
    console.log('组件挂载完成', this.ref);
  }

  render() {
    console.log('组件开始被编译', this.ref);
    return (
      <div>
        <h4 ref={this.ref}>{this.name}</h4>
      </div>
    )
  }
}

这就有点像是 vue 中的 beforeMount,均拿不到 dom

因此接口请求我们一般写在挂载完成 componentDidMount 中,因为有时候接口请求速度很快,会出现数据拿到了,但是 dom 还没渲染完成,若接口请求还想要操作 dom,就会失败,为了更好的操作 dom,请求我们写在挂载完成后

2. 更新时

更新阶段的 New props 就是拿到父组件传递过来的值setState 是自身数据源的改变forceUpdate 也是数据更新的方法,这是强制更新,这三个都会再一次触发 render,渲染完后又是更新 dom,最后又是更新 componentDidUpdate

因此更新阶段的钩子就只有两个,一个 render,一个 componentDidUpdate

刚刚上面的我改下,添加一个 setState,就是响应式更改数据源,那就一定会重新触发 rendercomponentDidUpdate

import React, { Component, createRef } from 'react'

export default class Life extends Component {

  constructor () {
    super()
    this.ref = createRef() // 存放dom
    this.state = {
        count: 1
    }
  }

  handleClick = () => {
    this.setState({
        count: this.state.count + 1
    })
  }

  componentDidUpdate() {
    console.log('组件更新完成');
  }

  render() {
    console.log('组件开始被编译', this.ref);
    return (
      <div>
        <h4 ref={this.ref} onClick={() => this.handleClick()}>{this.state.count}</h4>
      </div>
    )
  }
}

其实 react 中并没有说响应式这个概念,他就是原生 js,setState 是在数据更新时劫持了这个数据,setState 可以帮我们触发 render,更新视图,若不用 setState,数据是能照常更改,只是视图没有更新罢了

触发 render 操作的还有个 forceUpdate,这是强制更新,我们可以不用 setState 来改,如下

import React, { Component, createRef } from 'react'

export default class Life extends Component {

  constructor () {
    super()
    this.ref = createRef() 
    this.count = 1
  }

  handleClick = () => {
    this.count++
    this.forceUpdate() // 强制render重新调用
  }

  componentDidUpdate() {
    console.log('组件更新完成');
  }

  render() {
    console.log('组件开始渲染', this.ref);
    return (
      <div>
        <h4 ref={this.ref} onClick={() => this.handleClick()}>{this.count}</h4>
      </div>
    )
  }
}

在某些场景下,我们需要用 forceUpdate 来进行强制更新的

组件更新完成在 react 中只有一个 componentDidUpdate,而 vue 中就是 beforeUpdateupdated其实 react 中的 render 就是充当了 beforeUpdate

3.卸载时

就一个钩子 componentWillUnmount,组件卸载时执行

componentWillUnmount () {
	console.log('组件即将卸载');
}

4.总结

挂载时

  1. constructor:类中的构造器充当了生命周期,此时拿到数据源
  2. render:相当于vue中的 beforeMount,还拿不到 dom
  3. componentDidMount:挂载完成,可以拿到 dom

更新时

  1. render父组件传参 New props,修改数据源 setState,强制更新 forceUpdated 都会重新渲染 render
  2. componentDidUpdate:更新完成

卸载时

  1. componentWillUnmount:组件即将卸载时执行

5. 不常用的生命周期函数

常用的就是上面五个生命周期函数 constructorrendercomponentDidMountcomponentDidUpdate 和 componentWillUnmount,不常用的还有,如图,我把不常用的也展开来

 

static getDerivedStateFromProps()

这是个静态方法,因此这个生命周期函数只能在类组件中使用,这个方法比较冷门,它在render前调用,自行查看罕见用例

shouldComponentUpdate()

这个生命周期函数表示组件该不该更新,若里面返回 false,就不会给你更新视图,但是数据照常更新

import React, { Component, createRef } from 'react'

export default class Life extends Component {

  constructor () {
    console.log('组件开始加载');
    super()
    this.ref = createRef() // 存放dom
    this.state = {
        count: 1
    }
  }

  handleClick = () => {
    this.setState({
        count: this.state.count + 1
    })
    console.log(this.state.count);
  }

  shouldComponentUpdate() {
    return false
  }

  render() {
    console.log('组件开始渲染', this.ref);
    return (
      <div>
        <h4 ref={this.ref} onClick={() => this.handleClick()}>{this.state.count}</h4>
      </div>
    )
  }
}

打印下 count 的值,发现确实变化了,但是视图没有更新

getSnapshotBeforeUpdate()

这个函数返回的值会给到 componentDidUpdate,它在最近一个渲染输出后调用,也就是 render 完之后立马调用

这么看 react 的生命周期函数总共也就是 8 个,和 vue 的生命钩子数量差不多

参考文章:https://juejin.cn/post/7359821247675596835
 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

智汇云舟参编又一项国家标准

近日&#xff0c;智汇云舟参与了《信息技术 数字孪生能力成熟度模型》国家标准的编制工作。该标准由中国电子技术标准化研究院牵头&#xff0c;全国信息技术标准化技术委员会归口&#xff0c;北京航空航天大学、重庆邮电大学 、南方电网、腾讯云、安世亚太等知名高校、企业共同…

ONLYOFFICE 桌面编辑器 8.1

ONLYOFFICE 简介 ONLYOFFICE 是一个开源的办公套件&#xff0c;它提供了在线文档编辑器、表格编辑器和演示文稿编辑器&#xff0c;这些编辑器能够兼容 Microsoft Office 格式&#xff08;.docx, .xlsx, .pptx&#xff09;以及其他流行的标准格式。ONLYOFFICE 的核心功能包括多…

【转】5种常见的网络钓鱼攻击以及防护手段

2022 年 Verizon 数据泄露调查报告指出&#xff0c;去年 75% 的社会工程攻击涉及网络钓鱼&#xff0c;仅去年一年就有超过 33 万个账户被网络钓鱼&#xff0c;网络钓鱼占整体社会工程攻击的 41%。 不能将所有责任归咎于员工&#xff0c;因为薄弱的安全意识建设及宣教是大部分漏…

LeetCode 算法:对称二叉树 c++

原题链接&#x1f517;&#xff1a;对称二叉树 难度&#xff1a;简单⭐️ 题目 给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 示例 1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 示例 2&#xff1a; 输入&#xff1a;ro…

Windows C++ 应用软件开发从入门到精通详解

目录 1、引言 2、IDE 开发环境介绍 2.1、Visual Studio 2.2、Qt Creator 3、 C语言特性 3.1、熟悉泛型编程 3.2、了解C/C异常处理 3.3、熟练使用STL容器 3.4、熟悉C11新特性 4、Windows 平台的编程技术与调试技能 4.1、需要掌握的若干编程技术和基础知识 4.2、需…

37. 变焦镜头

导论&#xff1a; 设计好的一组镜头如果变化镜片与镜片之间的空气厚度&#xff0c;镜头的焦距会随之变化。 通常来说一个系统的接收面尺寸大小是固定不变的。 设计要求&#xff1a; 设计一个简单的变焦镜头&#xff1a;入瞳直径25mm&#xff0c;焦距75~125mm&#xff0c;像…

Python | Leetcode Python题解之第187题重复的DNA序列

题目&#xff1a; 题解&#xff1a; L 10 bin {A: 0, C: 1, G: 2, T: 3}class Solution:def findRepeatedDnaSequences(self, s: str) -> List[str]:n len(s)if n < L:return []ans []x 0for ch in s[:L - 1]:x (x << 2) | bin[ch]cnt defaultdict(int)for…

三人同行乐享模式:社交电商的新趋势

在数字化时代&#xff0c;社交电商正以其独特的优势崭露头角。其中&#xff0c;“三人同行乐享模式”就是一种创新的购物激励机制&#xff0c;它通过消费者的社交互动和分享&#xff0c;不仅促进了产品的销售&#xff0c;更加强了品牌的推广和影响力。 一、模式简介 此模式的核…

java基于ssm+jsp 人才公寓管理系统

1管理员功能模块 管理员登录&#xff0c;通过填写用户名、密码进行登录&#xff0c;如图1所示。 图1管理员登录界面图 管理员登录进入人才公寓管理系统可以查看个人中心、住户管理、小区公告管理、停车位管理、安保人员管理、安保值班管理、房屋信息管理、外来登记管理、物品…

vscode使用内置插件断点调试vue2项目

1、首先项目中要开启source-map 在vue.config.js 文件中 module.exports {configureWebpack: {devtool: process.env.NODE_ENV ! "production" ? "source-map" : ,} }2、项目根目录新建.vscode/launch.js文件 {"configurations": [{"ty…

【C++庖丁解牛】函数栈帧的创建与销毁

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. 寄存器2. ebp和esp是如…

win10系统管理员账号怎么切换

1、按住“windowsx”&#xff0c;选择“计算机管理” 2、在页面左侧&#xff0c;找到“计算机管理(本地)”&#xff0c;展开“系统工具”&#xff0c;点击“本地用户和组”下面的“用户”&#xff0c;在右侧找到“Administrator”&#xff0c;双击打开。 3、在打开页面选择常规…

高位图像的增强处理 DR图像等

输入16位图像 经过增强算法处理后的输出&#xff1a;

快速生成基于vue-element的后台管理框架,实现短时间二次开发

你是否遇到过当你想要独立开发一个项目时对反复造轮子的烦扰&#xff1f; 这种流水线的操作实在让人受不了 而vue-element-template很好的帮你解决了这个烦恼 只需克隆下来&#xff0c;改改图标&#xff0c;模块名&#xff0c;甚至样式&#xff0c;就会变成一个全新的自己的项目…

计算机组成原理笔记-第4章 存储器

第4章 存储器 笔记PDF版本已上传至Github个人仓库&#xff1a;CourseNotes&#xff0c;欢迎fork和star&#xff0c;拥抱开源&#xff0c;一起完善。 该笔记是最初是没打算发网上的&#xff0c;所以很多地方都为了自我阅读方便&#xff0c;我理解了的地方就少有解释&#xff1b…

ES6 入门—ES6 解构赋值

let [c 3, d c] [1]; // c 1, d 1 let [e 3, f e] [1, 2]; // e 1, f 2 示例代码&#xff1a;步骤一&#xff1a;新建一个名为 test5.js 的文件&#xff0c;在其中输入以下代码&#xff1a;console.log(“示例一&#xff1a;”); console.log(“a 与 b 匹配结果为…

HTML5+CSS3小实例:可爱的卷纸开关

实例:可爱的卷纸开关 技术栈:HTML+CSS 效果: 源码: 【HTML】 <!DOCTYPE html> <html lang="zh-CN"> <head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=…

复习2-20240624

vscode 使用 Javabean &#xff08;封装性&#xff09; public class Demo01 {/*1.原则 &#xff1a; 字母 数字 $ _ 中文 除了 这五个 其它都不可以2. 细则 &#xff1a; 数字 不能 开头%hbviunh &hfiureh )nhjrn 7487j -ni hbiu tgf hi…

Verifieable FHE(VFHE):使用Plonky2来证明Zama TFHE的“Bootstrapping的正确执行”

1. 引言 Zama团队2024年论文Towards Verifiable FHE in Practice: Proving Correct Execution of TFHE’s Bootstrapping using plonky2 中&#xff1a; 首次阐述了&#xff0c;在实践中&#xff0c;将整个FHE bootstrapping操作&#xff0c;使用SNARK来证明。在其相应的http…

Appium+python自动化(二十一)- 让猴子按你指令大闹手机,让我们都成为耍猴高手(超详解)

宏哥微信粉丝群&#xff1a;https://bbs.csdn.net/topics/618423372 有兴趣的可以扫码加入 简介  一年一度的暑假如期而至&#xff0c;每年必不可少的&#xff0c;便是《西游记》这部经典电视连续剧的播出&#xff0c;作为一名90后&#xff0c;对于这部经典剧的情谊&#xff…