react 设计哲学 | 严格模式

前言

官方介绍 详细解释了在 React 18+ 环境下严格模式的行为(包括双重渲染和双重 Effect)

组件 "双闪" 现象

当你使用 react 18+ 开发环境中使用 useEffect 开发的过程中是否遇到过定时器跑倍数或者内存泄露的问题?

例如: 下面的代码,你觉得页面中定时器显示的值应该是多少?

jsx 复制代码
import { useState, useEffect } from 'react'

function TimerFunction() {
  const [count, setCount] = useState(0)

  useEffect(() => {
    console.log('[Effect] 开启定时器')
    setInterval(() => {
      setCount((c) => c + 1)
    }, 1000)
  }, [])

  return <div>计数:{count}</div>
}

export default TimerFunction

直接揭晓答案,在严格模式下,当组件一加载,后台有两个定时器在跑,count 的值会成倍的增加。这里也是初学者容易困惑的地方,在严格模式 下,组件会模拟 挂载 -> 卸载 -> 重新挂载 的过程。这里相当于初始化的时候页面挂载了两个定时器,所以也就解释了为什么看到的 count 的值是成倍增加的。

为什么要这样做?

react 团队之在 react 18 中强制加入严格模式,这是由于很多开发者在非严格模式下测试时,觉得"首次加载没有问题,就忽略了清理函数",导致用户在当前页面停留时间过长,切换的页面越多,电脑越卡。而这种 bug 往往又很难发现,往往到了生产环境,用户反馈 "页面卡顿" 你才会意识到内存泄露了。

所以记得添加清理函数哦!!

jsx 复制代码
import { useState, useEffect } from 'react'

function TimerFunction() {
  const [count, setCount] = useState(0)

  useEffect(() => {
    console.log('[Effect] 开启定时器')
    const timer = setInterval(() => {
      setCount((c) => c + 1)
    }, 1000)

    // 这是函数组件的"生命周期清理"
    return () => {
      console.log('[Cleanup] 清理定时器')
      clearInterval(timer)
    }
  }, [])

  return <div>计数:{count}</div>
}

export default TimerFunction

我应该开启它吗?

答案是肯定的,虽然这样做会让你的log翻倍,但是可以提前帮你排查代码的逻辑漏洞和潜在风险,同时着严格模式在构建的过程中自动失效,所有不用担心生产环境影响用户的性能。

结余

react 的严格模式更像是对开发者的一种 "善意的怀疑" ,借用苏格拉底的一句话,"我唯一知道的,就是我一无所知"。

相关推荐
Dovis(誓平步青云)3 分钟前
导览音频切换太快,旧讲解不能覆盖新展品
android·前端·javascript·ecmascript·音视频·宠物
福兮说11 小时前
设计稿是 #4A7C6F,页面量出来是 #4B7C6F:HEX、HSL、透明度、canvas 来回转的七个坑
前端·javascript·css·canvas
郑州光合科技余经理11 小时前
海外版外卖加盟:总站与分站配送规则怎么分开管
java·开发语言·前端·后端·uni-app·php·ai编程
小呆呆66612 小时前
副业搞起来,小说,漫画,漫剧的成本优化思路
前端·后端·面试
Dovis(誓平步青云)12 小时前
浇水提醒刚弹出又消失,植物状态别只存一个百分比
开发语言·前端·javascript·pdf·ecmascript·电脑
码艺-Alimjan13 小时前
Vben Admin 新增维吾尔语 Vben-Modal的关键坑之一
前端·javascript·vue.js
可乐鸡翅yeah_13 小时前
hls.js 手动自定义 http 请求 loader,修改请求头实战
开发语言·前端·javascript·网络协议·http·ecmascript·m3u8在线
IT_陈寒14 小时前
Vite静态资源导入这个坑我帮你们踩过了
前端·人工智能·后端
广州华水科技14 小时前
大坝安全监测解决方案:单北斗GNSS形变监测系统应用与维护
前端
yivifu15 小时前
中文古籍电子书注释集成
前端·javascript·python·beautifulsoup·epub