首页 > 其他分享 >React 第八节组件生命周期钩子-类式组件,函数式组件模拟生命周期用法

React 第八节组件生命周期钩子-类式组件,函数式组件模拟生命周期用法

时间:2024-11-28 22:58:31浏览次数:5  
标签:生命周期 DOM React state 阶段 props 组件 挂载

概述

React组件的生命周期可以分为三个主要阶段:
挂载阶段(Mounting):组件被创建,插入到DOM 树的过程;
更新阶段(Updating):是组件中 props 以及state 发生变化时,重新render渲染视图过程;
卸载阶段(Unmounting):是DOM被从虚拟DOM树移除的过程;
每个阶段都伴随着一系列的生命周期方法,这些方法为开发者提供了在类式组件不同阶段执行操作不同代码的机会,使开发人员能够更好的处理业务交互。

1、类式组件中的生命周期

React 16.3 之前的钩子
请添加图片描述

React 16.3 之后的生命周期钩子
请添加图片描述

2、React 16.3 版本之前的 生命周期

这个版本的 React 有非常明确的生命周期,能够清晰的知道各个阶段的钩子函数,跟VUE2.0的非常相似,
主要钩子函数有如下:

2.1、挂载阶段:

constructor(props)

类的构造方法,在组件中被创建时候调用,用于初始化 state 和 绑定事件处理函数,但是这个时候不能调用 this.setState(), 因为此时组件还没有挂载到 DOM上;

componentWillMount()

将要插入回调,DOM结构生成前要执行的操作

render()

用于插入虚拟DOM 回调,将虚拟DOM 渲染到视图上的过程

componentDidMount()

虚拟 DOM插入回调已经完成,即视图已经渲染完成,页面真实DOM已经加载完,此阶段可以进行 数据请求、订阅或手动更改DOM

2.2、更新阶段:

每次在进行 this.setState() 操作,或者 子组件得到的 props 更新时候,都会执行此阶段的钩子函数,还有就是执行 forceUpdate() 时候 同样也会执行此阶段函数;

componentsWillUpdate()

视图将要更新前的回调操作;用于数据格式化等操作

render()

根据传入的 新state 或者 新 props 进行重新渲染视图

componentDidUpdate()

视图重新更新渲染已经完成, 可以在这里执行依赖于DOM的操作,如重新获取DOM尺寸或执行网络请求

2.3、卸载阶段

componentWillUnmount()

组件被移除回调,这个阶段可以处理一些定时任务,事件卸载、取消网络请求等操作

3、React 16.3 版本之后的生命周期

3.1、挂载阶段:

constructors(props)

类的构造方法,在组件被创建时调用。用于初始化state和绑定事件处理函数,创建 ref。注意,constructor中不能调用this.setState(),因为此时组件还未挂载到DOM上。

constructor(props) {
      console.log('==constructor==')
      // 获取上级传入 props
      super(props)
      // 声明 state 属性  count
      this.state = {
         count: 0
      }
   }

static getDerivedStateFromProps(props, state)

React 16.3引入的静态方法,在组件创建时和每次更新前调用。用于根据props更新state。如果不希望更新state,则返回null
如:

   static getDerivedStateFromProps(props, state) {
        // 根据props更新state
        console.log('==props=')
        console.log('==state=', state)
         //   表示给 count 设置初始值最终会渲染为 99
        return {count: 99}
    }

static 静态方法中是获取不到当前组件的实例的,不能进行 this.XX 操作 调用 如:this.fetch()

render()

渲染方法,根据组件的props和state返回React元素。render方法必须是一个纯函数,不能修改组件的状态或执行副作用。

componentDidMount()

组件挂载到DOM后调用。是执行副作用(如数据获取、订阅或手动更改DOM)。

3.2、更新阶段

在组件的props或state发生变化时,React会重新渲染组件

static getDerivedStateFromProps(props, state)

同挂载阶段,用于在更新前根据props更新state。 同上 返回 null 时候,不会更是视图;

shouldComponentUpdate(nextProps, nextState)

返回一个布尔值,决定组件是否应该更新。默认情况下返回true,但可以通过此方法优化性能,避免不必要的渲染,通过对比新旧数据判断是否需要执行更新视图操作。

render()

同挂载阶段,根据更新后的props和state重新渲染组件。

getSnapshotBeforeUpdate(prevProps, prevState)

在最近一次渲染输出(提交到DOM)之前调用,可以捕获一些信息(如滚动位置),这些信息将作为参数传递给componentDidUpdate。

componentDidUpdate(prevProps, prevState, snapshot)

组件更新后被调用。可以在这里执行依赖于DOM的操作,如重新获取DOM尺寸或执行网络请求

3.3 卸载阶段

componentWillUnmount()

在组件卸载及销毁之前调用。是执行清理操作(如取消网络请求、清除定时器)的理想位置。

类式组件生命周期钩子函数变化:

请添加图片描述

4、在函数式组件中如何模拟生命周期

生命周期主要分为 三个阶段,在函数式组件中是无法模拟出上面类式组件的各个生命钩子函数的,但是可以通过 useEffect() Hook模拟组件的 挂载、更新、销毁三个阶段;

4.1 模拟挂载阶段

与类组件中的 componentDidMount() 钩子函数相似

useEffect(() => {
   // 这里执行挂载时候操作
   console.log('===componentDidMount==')
   
}, []) // 第二参数为空 数组时候,表示 挂载、卸载时候执行;

4.2 模拟更新阶段

与类式组件中的 shouldComponentUpdate 类似

 useEffect(() => {
   // 这里执行挂载时候操作
   console.log('===componentDidMount==')
   console.log('===我更新了==')
   
}, [count]) // 第二参数为空 数组时候,表示 挂载、卸载时候执行;若第二个参数 传入了依赖属性,则该属性变化时候,会执行第一个参数的回调函数

4.3 模拟卸载阶段

与类式组件中的 componentWillUnmount() 类似


useEffect(() => {
        // 这里执行挂载时候操作
   console.log('===componentDidMount==', count)
   return () => {
      // 这里执行卸载后的操作
      console.log('=组件卸载了==')
   }
   
}, [count]) // 第二参数为空 数组时候,表示 挂载、卸载时候执行,

注意:官网现在推荐开发时候使用函数式组件,相对类式组件更加灵活方便,但是在编写通用性处理复杂的逻辑状态时候,还是建议使用类式组件,类式组件有很好的继承扩展性,通过生命周期钩子,能够更好的`

标签:生命周期,DOM,React,state,阶段,props,组件,挂载
From: https://blog.csdn.net/weixin_39593730/article/details/144065025

相关文章

  • 【VMware VCF】基于 RDU 方式更新 VCF 环境中的 vCenter Server 组件。
    ReducedDowntimeUpgrade(RDU)是一种基于“迁移”的vCenterServer更新方式,通过临时部署一个与源vCenterServer完全一致的目标vCenterServer(类似于跨版本vCenterServer升级),然后找一个维护窗口期完成源vCenterServer和目标vCenterServer的切换即可,由于使用RDU更新......
  • vue3实现keep-alive一个组件(一个vue使用多个页面支持缓存)使用多个页面(多个路由)已解决
    代码<router-viewv-if="routerAlive"><template#default="{Component,route}"><keep-alive:include="getCaches"><component:is="formatComponentInstance(Component,route.name)......
  • vxe-table v3 表格中使用 iview, view-design 组件库的
    在公司开发大型项目中,使用主流表格库vxe-tablev3和iview,view-design组件库,可以在可编辑单元格中渲染非常简单的使用更多的组件官网:https://vxetable.cn安装npminstallvxe-pc-ui@3.3.9vxe-table@3.11.10@vxe-ui/plugin-render-iview@3.0.0//...import{VxeUI}......
  • vxe-table v3 表格中使用 a- 集成 ant-design-vue 组件库的
    在公司开发大型项目中,使用主流表格库vxe-tablev3和ant-design-vue组件库,可以在可编辑单元格中渲染非常简单的使用更多的组件官网:https://vxetable.cn安装npminstallvxe-pc-ui@3.3.9vxe-table@3.11.10@vxe-ui/plugin-render-antd@3.0.1//...importVxeUIfrom'vx......
  • vue3-组件通信
    Vue3组件通信和Vue2`的区别:移出事件总线,使用mitt代替vuex换成了pinia把.sync优化到了v-model里面把$listeners所有的东西,合并到$attrs$children被移除自定义事件(与vue2语法差异)自定义事件常用于子组件向父组件传递数据原生事件:特点的click、hover等自......
  • vxe-table 表格中使用 element-ui 组件库的
    在公司开发大型项目中,使用主流表格库vxe-table和element-ui组件库,可以在可编辑单元格中渲染非常简单的使用更多的组件官网:https://vxetable.cn安装npminstallvxe-pc-ui@3.3.9vxe-table@3.11.10@vxe-ui/plugin-render-element@3.0.0//...import{VxeUI}from'vxe......
  • LVGL UI设计神器anyui之高阶组件
    破炉而出——LVGLUI设计神器anyui之高阶组件孙悟空吃了大量的巧克力豆后,在太上老君的炼丹炉中憋了七七四十九天,最终破炉而出,练就了火眼金睛,继七十二变和筋斗云之后第三大本领,省去了取经路上无数麻烦。试想如果没有孙悟空的火眼金睛,唐僧被抓走的次数得翻几番。可见,好的装......
  • [React]setState调用过于频繁的问题
    来自:文心一言在React中,如果setState被调用得太频繁,可能会出现状态没有按预期更新的情况。这是因为React为了性能优化,会批量更新状态,即便是连续快速调用setState,最终状态的更新仍会在一次渲染中执行。如果你尝试在某些异步操作(如事件监听器、网络请求或循环中)中连续多次调用setSt......
  • 【热门主题】000067 React前端框架:探索高效Web开发之路
    前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏+关注哦......
  • JAVA WEB和Tomcat各组件概念
    概述本篇文章是https://juejin.cn/post/7055306172265414663,这篇文章的再总结,剔除了与Java安全研究没太大关系的内容,对JAVAWEB中的Servlet、Filter、Listener以及Connector、Container则加重了篇幅。ServletServlet是运行在Web服务器或应用服务器上的程序,它充当了客户端HTT......