- Objective: - Breadcrumb: # 概念阐释 ## 语义 在React中,每当状态`useState`发生变化时,`useEffect`都会重新渲染效果。**这可能会导致性能问题或运行过载**,所以为了控制何时渲染,我们加入依赖项数组。 ## 语法 ```jsx useEffect(() => { // 只在组件挂载时执行一次 return () => { // 在组件卸载时执行清理 }; }, []); ``` # 实例 ```jsx import React, { useState ,useEffect} from 'react'; export default function Timer() { const [time, setTime] = useState(0); //计时器的初始状态为0 const [name, setName] = useState(""); //表单的初始字符为空 //添加一个效果,重复执行代码,每秒钟setTime更新为前一个数字+1 useEffect(()=>{ const intervalId = setInterval(()=>{ setTime(prev=>prev+1); },1000) return () => { clearInterval(intervalId); }; }, []);// 使用空依赖项数组,只在副作用挂载和卸载时分别执行一次 const handleChange = ({target}) => { setName(target.value) }; // 设置表单发生变化时的事件处理程序,新的name状态为用户输入的新的值 return ( <> <h1>Time: {time}</h1> <input value={name} onChange={handleChange} type="text"/> </> ); } ``` ![](https://image.harryrou.wiki/2024-01-05-CleanShot%202024-01-05%20at%2009.17.03%402x.png) # 相关内容 #### 空依赖数组 当`useEffect`的依赖项数组为空时,副作用仅在组件挂载时执行一次,以及在组件卸载时执行清理(如果有的话)。 #### 特定依赖项数组 当提供了特定的依赖项数组时,只有当数组中的任一依赖项发生变化时,副作用才会重新执行。这提供了对副作用执行时机的精确控制。例如如果在本例中加入`[time]`,那么只有当`time`发生变化时才会执行副作用函数。 # 参考资料 - [control when effect are called - codecademy](https://www.codecademy.com/journeys/full-stack-engineer/paths/fscj-22-front-end-development/tracks/fscj-22-react-part-ii/modules/wdcp-22-function-components-and-hooks-a2dba9bf-fc64-4118-8656-dfdc35f9e5cc/lessons/the-effect-hook/exercises/control-when-effects-are-called) - [GPT](https://chat.openai.com/share/7a0f1d65-c4c8-41a7-8e80-5317d84ff338)