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

做宠物的网站微网站什么意思

做宠物的网站,微网站什么意思,wordpress文章只显示标题,做公众号首图的设计网站React 的 useEffect 清理函数详解 useEffect 是 React 中用于处理副作用(side effects)的 Hook,清理函数(Cleanup Function)是 useEffect 中返回的一个函数,用于清理或撤销副作用。清理函数的主要目的是确…

React 的 useEffect 清理函数详解

useEffect 是 React 中用于处理副作用(side effects)的 Hook,清理函数(Cleanup Function)是 useEffect 中返回的一个函数,用于清理或撤销副作用。清理函数的主要目的是确保副作用不会在组件卸载或依赖项更新时造成问题,比如内存泄漏或不必要的逻辑执行。


清理函数的基本语法


useEffect(() => {// 副作用逻辑console.log("Effect logic");// 返回清理函数return () => {console.log("Cleanup logic");};
}, [dependencies]); // 依赖项
工作机制
  • 初始执行

    • 当组件首次渲染时,useEffect 的副作用逻辑会执行。
    • 此时,清理函数不会被调用。
  • 依赖项更新时

    • 如果依赖项(dependencies)发生变化,React 会先调用清理函数,然后再重新执行新的副作用逻辑。
  • 组件卸载时

    • 当组件被卸载时,清理函数会被调用以撤销副作用。

清理函数的典型用途

清理函数的主要用途是清除或撤销在 useEffect 中创建的副作用,例如:

  1. 移除事件监听器
  2. 取消网络请求或定时器
  3. 清理订阅(如 WebSocket 或 Redux 订阅)
  4. 释放内存资源

举例说明

1. 清除事件监听器

如果在 useEffect 中添加了事件监听器,清理函数可以确保组件卸载时移除事件监听器。

javascript
import React, { useEffect } from "react";function Example() {useEffect(() => {const handleResize = () => {console.log("Window resized");};// 添加事件监听器window.addEventListener("resize", handleResize);// 清理函数:移除事件监听器return () => {window.removeEventListener("resize", handleResize);};}, []); // 空依赖数组,表示只在组件挂载和卸载时执行return <div>Resize the window to see logs in the console</div>;
}

工作流程:
  1. 组件挂载时
    • 添加 resize 事件监听器。
  2. 组件卸载时
    • 移除 resize 事件监听器,防止内存泄漏。

2. 清除定时器

如果在 useEffect 中设置了定时器,清理函数可以确保组件卸载时清除定时器。


import React, { useState, useEffect } from "react";function Timer() {const [count, setCount] = useState(0);useEffect(() => {const interval = setInterval(() => {setCount((prev) => prev + 1);}, 1000);// 清理函数:清除定时器return () => {clearInterval(interval);};}, []); // 空依赖数组,表示只在组件挂载和卸载时执行return <div>Count: {count}</div>;
}

工作流程:
  1. 组件挂载时
    • 设置定时器,每秒更新 count
  2. 组件卸载时
    • 清除定时器,防止组件卸载后继续更新状态。

3. 清理订阅

如果在 useEffect 中订阅了某些外部数据源(如 WebSocket 或 Redux),清理函数可以确保在组件卸载时取消订阅。


import React, { useEffect } from "react";function WebSocketComponent() {useEffect(() => {const socket = new WebSocket("wss://example.com/socket");socket.onmessage = (event) => {console.log("Message from server:", event.data);};// 清理函数:关闭 WebSocket 连接return () => {socket.close();};}, []); // 空依赖数组,表示只在组件挂载和卸载时执行return <div>WebSocket Component</div>;
}

工作流程:
  1. 组件挂载时
    • 创建 WebSocket 连接。
    • 监听消息。
  2. 组件卸载时
    • 关闭 WebSocket 连接,释放资源。

4. 依赖项更新时的清理

如果 useEffect 的依赖项发生变化,清理函数会在旧的依赖被替换前执行。


import React, { useState, useEffect } from "react";function DependencyExample() {const [count, setCount] = useState(0);useEffect(() => {console.log(`Effect triggered for count: ${count}`);return () => {console.log(`Cleanup for count: ${count}`);};}, [count]); // 依赖 countreturn (<div><p>Count: {count}</p><button onClick={() => setCount((prev) => prev + 1)}>Increment</button></div>);
}

工作流程:
  1. 初始 count = 0
    • useEffect 执行,输出 Effect triggered for count: 0
  2. count 更新为 1
    • 清理函数执行,输出 Cleanup for count: 0
    • 然后,useEffect 执行,输出 Effect triggered for count: 1

清理函数的使用场景总结

场景示例清理函数作用
事件监听器window.addEventListener移除事件监听器,防止内存泄漏
定时器setInterval 或 setTimeout清除定时器,防止组件卸载后继续执行
订阅WebSocket、Redux 订阅取消订阅,释放资源
依赖项更新动态依赖项在依赖项变化时清理旧的副作用
外部库实例化或初始化地图、图表库等初始化销毁外部库实例,防止内存泄漏

useEffect 的清理函数运行时机

  1. 组件卸载时

    • 当组件被移除时,清理函数会被执行一次。
  2. 依赖项更新时

    • 如果 useEffect 的依赖项发生变化,React 会先执行清理函数,再执行新的副作用逻辑。
  3. React 渲染优化

    • 如果组件的依赖项没有变化,React 不会重新执行 useEffect,也不会调用清理函数。

最佳实践

  1. 始终清理副作用

    • 确保在 useEffect 中创建的任何副作用(如事件监听器、定时器、订阅)都在清理函数中正确清除。
  2. 避免过度依赖外部资源

    • 如果 useEffect 中使用了外部变量,确保它们被正确声明为依赖项,避免意外行为。
  3. 理解依赖项行为

    • 确保依赖项的正确性,避免遗漏或过多依赖项,导致副作用重复执行。

文章转载自:

http://hJtA5lDR.strbc.cn
http://fnEJ7zfM.strbc.cn
http://Wt8HgmeP.strbc.cn
http://93MdABas.strbc.cn
http://NkrVryt2.strbc.cn
http://D6sSEtYU.strbc.cn
http://UVyimBYK.strbc.cn
http://dxamnwEd.strbc.cn
http://IdM9oezB.strbc.cn
http://2SfkjEgi.strbc.cn
http://yKB4qYf9.strbc.cn
http://amiCO4jE.strbc.cn
http://tt6PLBte.strbc.cn
http://RXyXYvL3.strbc.cn
http://XeW4WyxZ.strbc.cn
http://ttBvuoL7.strbc.cn
http://pMweEAmd.strbc.cn
http://3cS6KFos.strbc.cn
http://PpCGnjas.strbc.cn
http://cdVkY2Zk.strbc.cn
http://EUF0ZdiT.strbc.cn
http://7R0qNvvX.strbc.cn
http://OJQyukp9.strbc.cn
http://dssXcmxS.strbc.cn
http://fAYuCvsX.strbc.cn
http://wTFpCrWl.strbc.cn
http://GPSBY5Ms.strbc.cn
http://YILl3PQy.strbc.cn
http://xyG7pSE0.strbc.cn
http://2nn0gcD0.strbc.cn
http://www.dtcms.com/wzjs/699409.html

相关文章:

  • 麻涌镇网站仿做做网站需要机吗
  • 手机营销型网站制作江西省seo
  • 网站客户留言高校文明校园建设专题网站
  • 腾讯云快速建站百度指数怎么提升
  • 开发个网站开票名称是什么意思怎样在微信中做网站
  • 佛山模板网站建设泰安做网站优化
  • 关于建设门户网站的通知企业网站建设规划设计任务书
  • 推荐外贸网站建设的公司公司网站asp源码
  • 关于h5的网站模板wordpress文本块
  • 洛阳市住房和城乡建设网站wordpress个人网站模板
  • 做网站重要标签图库素材网站模板
  • 品牌网站 响应式网站视频营销成功的案例
  • 泉州比较好的网站开发建设公司seo搜索引擎优化就业指导
  • 太原网站建设推广服务wordpress学习教程
  • 做破解软件网站赚广告费游戏网站模板免费下载
  • 秦皇岛网站开发报价济南网站建设 小程序
  • 棋牌 彩票网站建设手机网站开发注意的问题
  • 东莞网站建设网站东莞网站设计制作
  • 谷歌怎么推广自己的网站手机制作报价单app
  • 深圳市城乡建设部网站首页在线视频下载网站如何做
  • js网站跳转代码ui网页设计技巧
  • 大同建设银行保安招聘网站做网站服务器什么配置
  • 如何屏蔽网站ip永久免费的财务软件
  • 新手可以自己学做网站设计吗怎么创建网页的快捷方式
  • 网站制作需要多少钱新闻网站推广软文代发
  • 建各企业网站多少钱做打折网站如何
  • 可以做投票的网站网站设计专业公司
  • 深圳做网站(官网)手机微信客户端网站建设
  • 建立网站平台网页设计提升班有哪些
  • 怎么在网上接网站建设前端做网站需要