当前位置: 首页 > article >正文

React 生命周期 - useEffect 介绍

在 React 中,useEffect 钩子可以被看作是函数组件中的一种副作用管理工具,它的行为可以模拟类组件中的不同生命周期方法。useEffect 的执行时机取决于其依赖项数组(第二个参数)的设置方式。

根据 useEffect 的使用方式,它可以对应以下几种类组件生命周期方法:

1、 componentDidMount(组件挂载)

当你传递一个空的依赖数组 [] 时,useEffect 相当于 componentDidMount,即只在组件首次挂载时运行。

useEffect(() => {
  // 只在组件首次挂载时运行
  console.log('Component mounted');
}, []); // 空数组作为依赖项

等效于类组件的:

componentDidMount() {
  console.log('Component mounted');
}

2、 componentDidUpdate(组件更新)

如果 useEffect 的依赖数组中包含某些特定的状态或 props,当这些值发生变化时,useEffect 会在组件更新时重新执行,相当于 componentDidUpdate。

useEffect(() => {
  // 只在组件首次挂载时运行
  console.log('Component mounted');
}, []); // 空数组作为依赖项

等效于类组件的:

componentDidUpdate(prevProps, prevState) {
  if (prevState.someState !== this.state.someState) {
    console.log('Component updated because "someState" changed');
  }
}

3、 componentWillUnmount(组件卸载)

useEffect 可以返回一个清理函数,这个清理函数在组件卸载时(或依赖项更新时)执行,相当于 componentWillUnmount。

useEffect(() => {
  console.log('Component mounted');

  return () => {
    console.log('Component will unmount');
  };
}, []); // 空数组,表示只在卸载时清理

等效于类组件的:
componentWillUnmount() {
console.log(‘Component will unmount’);
}

4、 componentDidMount + componentDidUpdate

如果不传递依赖数组,useEffect 会在每次组件渲染后执行,相当于同时模拟了 componentDidMount 和 componentDidUpdate。

useEffect(() => {
  console.log('Component mounted or updated');
});

等效于类组件的:

componentDidMount() {
  console.log('Component mounted');
}

componentDidUpdate() {
  console.log('Component updated');
}

5、React生命周期总结

React 17版本之前
在这里插入图片描述

React 17版本之后
在这里插入图片描述
在新的生命周期中,react弃用了componentWillMount、componentWillReceiveProps、componentWillUpdate这三个钩子,取而代之的是getDerivedStateFromProps,其实就是把那三个钩子的含义融入到了这一个钩子中,写法如下:

static getDerivedStateFromProps(props, state) {
 console.log('getDerivedStateFromProps---props, state:', props, state)
 // 如果return null 则依然以原来的规则更新state,否则会锁定更新state
 return null
 // return {a:11}
 }

http://www.kler.cn/a/327551.html

相关文章:

  • Ajax的相关内容
  • 【服务器组件】如何辨别服务器组件
  • prop校验,prop和data区别
  • [Qt platform plugin问题] Could not load the Qt platform plugin “xcb“
  • 如何合理设计一套springcloud+springboot项目中的各个微服务模块之间的继承关系的最优方案
  • Linux之vim模式下全选命令
  • WebGIS包括哪些技术栈?怎么学习?
  • 足球青训俱乐部后台:Spring Boot开发策略
  • 滚雪球学MySQL[11.1讲]:总结与展望
  • Spring Boot 点餐系统:简化您的订餐流程
  • 一个服务器可以搭建几个网站
  • vue结合element-ui实现列表拖拽变化位置,点击拖动图标拖动整个列表元素,使用tsx格式编写
  • SpringBootTest Mockito 虚实结合编写测试
  • LPDDR4芯片学习(二)——Functional Description
  • 解锁高效开发的秘密武器
  • <Rust>egui学习之部件(十三):如何为文本添加链接Link和超链接HyperLink功能?
  • 基于J2EE技术的高校社团综合服务系统
  • 设计模式---代理模式
  • webpack使用
  • 【Spring Boot 入门一】构建你的第一个Spring Boot应用
  • ECMAScript 详解
  • 新版本Android Studio如何新建Java code工程
  • MATLAB中数据导入与导出的全面指南
  • Ionic 颜色:探索前端开发的调色板
  • Spring Boot实现足球青训俱乐部管理自动化
  • ubuntu20.04系统安装zookeeper简单教程