news 2026/6/10 13:00:43

RN 实战:为什么 90% 的 useEffect 都可以删掉?

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
RN 实战:为什么 90% 的 useEffect 都可以删掉?

网罗开发(小红书、快手、视频号同名)

大家好,我是展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等方向。在移动端开发、鸿蒙开发、物联网、嵌入式、云原生、开源等领域有深厚造诣。

图书作者:《ESP32-C3 物联网工程开发实战》
图书作者:《SwiftUI 入门,进阶与实战》
超级个体:COC上海社区主理人
特约讲师:大学讲师,谷歌亚马逊分享嘉宾
科技博主:华为HDE/HDG

我的博客内容涵盖广泛,主要分享技术教程、Bug解决方案、开发工具使用、前沿科技资讯、产品评测与使用体验。我特别关注云服务产品评测、AI 产品对比、开发板性能测试以及技术报告,同时也会提供产品优缺点分析、横向对比,并分享技术沙龙与行业大会的参会体验。我的目标是为读者提供有深度、有实用价值的技术洞察与分析。

展菲:您的前沿技术领航员
👋 大家好,我是展菲!
📱 全网搜索“展菲”,即可纵览我在各大平台的知识足迹。
📣 公众号“Swift社区”,每周定时推送干货满满的技术长文,从新兴框架的剖析到运维实战的复盘,助您技术进阶之路畅通无阻。
💬 微信端添加好友“fzhanfei”,与我直接交流,不管是项目瓶颈的求助,还是行业趋势的探讨,随时畅所欲言。
📅 最新动态:2025 年 3 月 17 日
快来加入技术社区,一起挖掘技术的无限潜能,携手迈向数字化新征程!


文章目录

    • 前言
    • useEffect 的本质是什么?
    • useEffect 滥用的典型场景
      • 1. 用 useEffect 做派生状态
      • 2. useEffect 控制渲染逻辑
      • 3. 复杂组件里写“多条 effect”
    • 为什么大部分 useEffect 可以删掉
      • 原因 1:effect 被用作“状态计算”
      • 原因 2:effect 被用作“条件渲染”
      • 原因 3:effect 被用作“组合逻辑”
    • 判断一个 useEffect 是否必须
    • 真实案例拆解
      • 原始写法
      • 滥用示例
    • 优化 useEffect 的策略
      • 策略 1:计算 vs 副作用分离
      • 策略 2:把副作用下沉到自定义 Hook
      • 策略 3:effect 只做三件事
    • 总结

前言

如果你写过 React 或 React Native,一定有这种感受:

  • 页面里 useEffect 太多,刷新一次就好像在跑马拉松
  • eslint 一堆依赖提示,你直接关掉就完事
  • 改个状态,结果一串 effect 被触发,页面像爆炸一样

那么问题来了:

大部分 useEffect,真的用对了吗?

没错——在真实项目里,我发现90% 的 useEffect 都可以删掉
今天就来聊聊为什么,删掉后还能让项目更稳、更易维护。

useEffect 的本质是什么?

一句话总结:

useEffect = 当某些值变化时,要执行一件副作用操作。

副作用(side effect)指的是:

  • 网络请求
  • 订阅 / 监听
  • 与外部系统交互(例如导航、Alert、定时器)

注意:计算、派生状态、渲染逻辑,都不算副作用。

useEffect 滥用的典型场景

1. 用 useEffect 做派生状态

const[total,setTotal]=useState(0)useEffect(()=>{setTotal(price*count)},[price,count])

问题:

  • total 可以直接计算,不需要放 state
  • useEffect 成了“状态中转站”,增加维护成本

改进:

consttotal=price*count

2. useEffect 控制渲染逻辑

useEffect(()=>{if(user)setShow(true)},[user])

其实完全可以:

constshow=!!user

effect 没有副作用,只是为了“转换数据”,完全可以删掉。

3. 复杂组件里写“多条 effect”

useEffect(()=>{fetchA()},[a])useEffect(()=>{fetchB()},[b])useEffect(()=>{doC()},[c])

问题:

  • 逻辑分散,难调试
  • 很多 effect 可以合并或者直接放到 hook 里处理
  • page 层成为副作用的集合体

为什么大部分 useEffect 可以删掉

总结下来,有三个核心原因:

原因 1:effect 被用作“状态计算”

很多人写:

useEffect(()=>{setFiltered(list.filter(item=>item.active))},[list])

本质上这是计算,不是副作用
可以直接用:

constfiltered=list.filter(item=>item.active)

原因 2:effect 被用作“条件渲染”

useEffect(()=>{setVisible(flag)},[flag])

这根本不需要 effect
直接:

constvisible=flag

原因 3:effect 被用作“组合逻辑”

useEffect(()=>{if(a&&b)doSomething()},[a,b])

可以考虑:

  • 把逻辑下沉到 hook
  • 或者用 useMemo / useCallback 组合

判断一个 useEffect 是否必须

问自己三个问题:

  1. 这个 effect 有副作用吗?
  2. 它在做计算还是同步状态吗?
  3. 它会和外部系统交互吗?

如果答案都是否定的,删掉它,改用计算或 memo 化

真实案例拆解

原始写法

const[loading,setLoading]=useState(false)const[list,setList]=useState([])useEffect(()=>{setLoading(true)fetchData(params).then(res=>{setList(res)setLoading(false)})},[params])

这里的 useEffect 是必须的,因为 fetchData 属于副作用。

滥用示例

const[visible,setVisible]=useState(false)useEffect(()=>{setVisible(user!==null)},[user])

可以改成:

constvisible=user!==null

效果一样,但删掉一个 effect,页面更轻量。

优化 useEffect 的策略

策略 1:计算 vs 副作用分离

  • 所有派生状态、计算,尽量用变量或 useMemo

策略 2:把副作用下沉到自定义 Hook

  • fetch / subscribe / navigation 都写在 hook 里
  • 页面只组装,不写 effect

策略 3:effect 只做三件事

  • 网络请求
  • 外部系统交互
  • 订阅 / 监听

其他一律不要。

总结

  1. 90% 的 useEffect 可以删掉,因为它们承担了不该它承担的逻辑
  2. effect 是副作用,不是状态计算工具
  3. 副作用要集中、可预测、可组合,乱写只会让项目失控

当你开始用“副作用视角”审查 useEffect,你会发现:

  • 页面逻辑更清晰
  • eslint 不再可怕
  • 性能更稳,bug 更少
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 16:16:37

火山引擎SDK调用Qwen-Image API详细参数说明

火山引擎SDK调用Qwen-Image API详细参数说明 在AI生成内容(AIGC)正加速重塑创意产业的今天,企业对图像生成技术的需求早已不再局限于“能画出一张图”。越来越多的应用场景要求模型不仅能理解复杂语义、输出高分辨率图像,还要支持…

作者头像 李华
网站建设 2026/6/10 17:57:12

从GitHub克隆到本地运行:Stable Diffusion 3.5 FP8全流程部署手册

Stable Diffusion 3.5 FP8 全流程部署实战指南 在生成式 AI 飞速演进的今天,文本到图像模型早已不再是实验室里的“黑科技”,而是逐步走入设计师、内容创作者甚至普通用户的日常工具链。Stable Diffusion 系列凭借其开源生态和强大表现力,始终…

作者头像 李华
网站建设 2026/6/10 15:24:06

从零开始配置Qwen3-VL-8B:PyTorch安装与transformer模型详解

从零开始配置Qwen3-VL-8B:PyTorch安装与transformer模型详解 在电商客服系统中,用户上传一张衣服的照片并提问:“这件外套适合什么场合穿?”传统图像识别只能标注“男式夹克”,而无法理解“搭配建议”这类语义需求。这…

作者头像 李华
网站建设 2026/6/10 15:33:12

ComfyUI工作流分享:使用Qwen-Image-Edit-2509去水印技巧

ComfyUI工作流分享:使用Qwen-Image-Edit-2509去水印技巧 在电商运营、内容创作和广告设计的日常工作中,一个看似微不足道却极其耗时的问题反复出现——图片上的水印该怎么高效清除?传统方式依赖Photoshop这类工具,需要手动选区、克…

作者头像 李华
网站建设 2026/6/10 15:34:58

Dify智能体平台接入Qwen3-VL-30B实现可视化Agent编排

Dify智能体平台接入Qwen3-VL-30B实现可视化Agent编排 在企业智能化转型的浪潮中,一个日益突出的问题浮出水面:我们每天产生的大量信息,80%以上是非结构化的图像和图表,而传统AI系统却“视而不见”。一份财务报告中的折线图、一张医…

作者头像 李华
网站建设 2026/6/10 16:31:58

3步解锁喜马拉雅全站音频:这款下载工具让你永久拥有付费内容

3步解锁喜马拉雅全站音频:这款下载工具让你永久拥有付费内容 【免费下载链接】xmly-downloader-qt5 喜马拉雅FM专辑下载器. 支持VIP与付费专辑. 使用GoQt5编写(Not Qt Binding). 项目地址: https://gitcode.com/gh_mirrors/xm/xmly-downloader-qt5 还在为无法…

作者头像 李华