React之Class类组件的生命周期

简介: React之Class类组件的生命周期

生命周期的简单说法


react在render阶段会深度遍历react fiber 树,目的就是发现不同(diff),不同的地方就是接下来需要更新的地方,对于变化的组件,就会执行render函数,在一次render过程中结束后,就回到commit阶段,commit阶段会创建修改真实的DOM节点。


生命周期执行过程

  1. 初始化阶段
  • constructor 执行


在mount阶段,首先执行的是constructClassInstance函数,用来实例化React组件,在组件章节已经介绍了这个函数,组件中constructor就是在这里执行的。


在组件实例化之后,它会调用mountClassInstance组件初始化


getDerivedStateFormProps执行


在初始化阶段,getDerivedStateFromProps是第二个执行的生命周期,值得注意的是它是从ctor类上直接绑定的静态方法,传入props,State。返回值将之前的state合并,作为新的state,传递给组件实例使用.


componentWillMount 执行


render 函数执行


componentDidMount 执行


从这一步之前react其实一直在render阶段进行执行。一旦react,调和完所有的fiber节点,就会到commit阶段,在组件初始化commit阶段,会调用componentDidMount生命周期。


react 开始的执行顺序为:constructor -> getDerivedStateFromProps / componentWillMount -> rednder -> componentDidMount



44b1d62f4a64f44f4a1834068fefeee4.png


更新阶段


执行生命周期componentWillReceiveProps


受限判断getDerivedStateFromProps 生命周期是否存在,如果不存在就窒息感componentWillReceiveProps生命周期,传入该生命周期有两个参数,分别为newProps和nextContext。


执行 getDerivedStateFromProps


上述下来执行它,返回的值用于合并state,生成新的state。


执行shouldComponentUpdate


下来执行它,传入新的props,新的state,和新的context,返回值决定是否继续执行render函数,tiao'he 子节点。


执行componentWillUpdate


updateClassInstance方法到此结束。


执行render


执行render,得到最新的react element 元素,然后继续调和子节点。


执行getSnapshotBeforeUpdate


getSnapshotBeforeUpdate 的执行也是在 commit 阶段,commit 阶段细分为 before Mutation( DOM 修改前),Mutation ( DOM 修改),Layout( DOM 修改后) 三个阶段,getSnapshotBeforeUpdate 发生在before Mutation 阶段,生命周期的返回值,将作为第三个参数 __reactInternalSnapshotBeforeUpdate 传递给 componentDidUpdate 。


执行componentDIdUpdate


这里dom已经修改完成,可以操作修改之后的dom。


各个生命周期的能力


constructor


constructor 在类组件创建实例时调用,而且初始化的时候执行一次,所以可以在 constructor 做一些初始化的工作。


componentDidUpdate

componentDidUpdate(prevProps, prevState, snapshot){
    const style = getComputedStyle(this.node)
    const newPosition = { /* 获取元素最新位置信息 */
        cx:style.cx,
        cy:style.cy
    }
}


三个参数:


prevProps 更新之前的 props ;


prevState 更新之前的 state ;


snapshot 为 getSnapshotBeforeUpdate 返回的快照,可以是更新前的 DOM 信息。


作用


componentDidUpdate 生命周期执行,此时 DOM 已经更新,可以直接获取 DOM 最新状态。这个函数里面如果想要使用 setState ,一定要加以限制,否则会引起无限循环。


接受 getSnapshotBeforeUpdate 保存的快照信息。


componentDidMount


componentDidMount 生命周期执行时机和 componentDidUpdate 一样,一个是在初始化,一个是组件更新。此时 DOM 已经创建完,既然 DOM 已经创建挂载,就可以做一些基于 DOM 操作,DOM 事件监听器。


async componentDidMount(){
    this.node.addEventListener('click',()=>{
        /* 事件监听 */
    }) 
    const data = await this.getData() /* 数据请求 */
}


componentWillUnmount


组件销毁。清除计时器,或者做一些组件销毁时的任务。

目录
相关文章
|
3天前
|
前端开发 JavaScript 开发者
React 按钮组件 Button
本文介绍了 React 中按钮组件的基础概念,包括基本的 `<button>` 元素和自定义组件。详细探讨了事件处理、参数传递、状态管理、样式设置和可访问性优化等常见问题及其解决方案,并提供了代码示例。帮助开发者避免易错点,提升按钮组件的使用体验。
103 77
|
4天前
|
前端开发 UED 开发者
React 对话框组件 Dialog
本文详细介绍了如何在 React 中实现一个功能完备的对话框组件(Dialog),包括基本用法、常见问题及其解决方案,并通过代码案例进行说明。从安装依赖到创建组件、添加样式,再到解决关闭按钮失效、背景点击无效、键盘导航等问题,最后还介绍了如何添加动画效果和处理异步关闭操作。希望本文能帮助你在实际开发中更高效地使用 React 对话框组件。
98 75
|
1月前
|
前端开发 JavaScript 测试技术
React 分页组件 Pagination
本文介绍了如何在 React 中从零构建分页组件,涵盖基础概念、常见问题及解决方案。通过示例代码详细讲解了分页按钮的创建、分页按钮过多、初始加载慢、状态管理混乱等常见问题的解决方法,以及如何避免边界条件、性能优化和用户反馈等方面的易错点。旨在帮助开发者更好地理解和掌握 React 分页组件的开发技巧,提升应用的性能和用户体验。
69 0
|
9天前
|
前端开发 Java API
React 进度条组件 ProgressBar 详解
本文介绍了如何在 React 中创建进度条组件,从基础实现到常见问题及解决方案,包括动态更新、状态管理、性能优化、高级动画效果和响应式设计等方面,帮助开发者构建高效且用户体验良好的进度条。
37 18
|
23天前
|
存储 前端开发 测试技术
React组件的最佳实践
React组件的最佳实践
|
22天前
|
前端开发 API 开发者
React 文件上传组件 File Upload
本文详细介绍了如何在 React 中实现文件上传组件,从基础的文件选择和上传到服务器,再到解决文件大小、类型限制、并发上传等问题,以及实现多文件上传、断点续传和文件预览等高级功能,帮助开发者高效构建可靠的应用。
48 12
|
17天前
|
存储 前端开发 JavaScript
React 表单输入组件 Input:常见问题、易错点及解决方案
本文介绍了在 React 中使用表单输入组件 `Input` 的基础概念,包括受控组件与非受控组件的区别及其优势。通过具体代码案例,详细探讨了创建受控组件、处理多个输入字段、输入验证和格式化的方法,并指出了常见易错点及避免方法,旨在提升表单的健壮性和用户体验。
28 4
|
24天前
|
前端开发 JavaScript API
React 文件下载组件 File Download
本文介绍了在React中实现文件下载组件的方法,包括使用`a`标签和JavaScript动态生成文件,解决了文件路径、文件类型、大文件下载及文件名乱码等问题,并展示了使用第三方库`file-saver`和生成CSV文件的高级用法。
35 6
|
21天前
|
前端开发 JavaScript API
React 文件下载组件:File Download
本文详细介绍了如何在React应用中实现文件下载组件,包括基本概念、实现步骤和代码示例。同时,探讨了常见问题如文件类型不匹配、文件名乱码等及其解决方法,旨在提升用户体验和代码可维护性。
39 2
|
25天前
|
存储 前端开发 JavaScript
React 文件上传组件 File Upload
本文介绍了如何在 React 中实现文件上传组件,包括基本的概念、实现步骤、常见问题及解决方案。通过 `<input type="file">` 元素选择文件,使用 `fetch` 发送请求,处理文件类型和大小限制,以及多文件上传和进度条显示等高级功能,帮助开发者构建高效、可靠的文件上传组件。
67 2