news 2026/6/18 15:49:19

usePrev

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
usePrev

一、完整代码示例(React 18+)

import { useState, useRef, useEffect } from 'react'; // 自定义 Hook:usePrev,保存上一次渲染的值 function usePrev(value) { const ref = useRef(); // 每次 value 变化后,把当前值存入 ref,供下一次渲染读取 useEffect(() => { ref.current = value; }, [value]); // 组件渲染阶段,返回 ref.current(此时还是上一次的值) return ref.current; } // 使用示例:计数器 export default function Counter() { const [count, setCount] = useState(0); // 拿到上一次的 count const prevCount = usePrev(count); return ( <div style={{ padding: 20 }}> <h2>usePrev 示例:计数器</h2> <p>现在的值:{count}</p> <p>上一次的值:{prevCount ?? 'undefined(首次渲染)'}</p> <button onClick={() => setCount(c => c + 1)}>加 1</button> <button onClick={() => setCount(c => c - 1)} style={{ marginLeft: 8 }}>减 1</button> </div> ); }

二、运行效果说明

表格

渲染次数count(当前值)prevCount(返回值)说明
第 1 次0undefineduseEffect还没执行,ref.current初始为undefined
第 2 次10上一次渲染的count0,已被存入ref
第 3 次21上一次渲染的count1

核心逻辑:

  • 组件渲染时,usePrev直接返回ref.current,此时它还是上一次的值
  • 渲染完成后,useEffect才会执行,把最新的value存入ref,供下一次渲染读取。

三、进阶用法:监听值的变化

你可以用它做一个 “值变化监听” 的效果:

function App() { const [count, setCount] = useState(0); const prevCount = usePrev(count); useEffect(() => { if (prevCount !== undefined && prevCount !== count) { console.log(`count 从 ${prevCount} 变成了 ${count}`); } }, [count, prevCount]); return ( <div> <p>count: {count}</p> <button onClick={() => setCount(c => c + 1)}>加 1</button> </div> ); }

四、注意事项 & 坑点

  1. 第一次渲染返回undefined因为useRef初始值为空,useEffect在渲染完成后才执行,所以首次渲染拿到的是undefined。 解决方法:可以给useRef设初始值,或使用useLayoutEffect(不推荐,可能影响性能)。

  2. useEffect是异步的useEffect之外直接读取ref.current,拿到的是上一次的值,这正是usePrev的设计目的。

  3. 只能用于组件 / 自定义 Hook 顶层不能放在条件判断、循环里调用,这是 React Hook 的通用规则。

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

告别卡顿!用BiSeNet V2在1080Ti上实现156FPS的实时街景分割(附PyTorch代码)

突破性能瓶颈&#xff1a;BiSeNet V2在1080Ti上的156FPS实战指南当自动驾驶系统需要在瞬息万变的城市街道中做出毫秒级决策时&#xff0c;当安防监控系统必须实时分析数十路高清视频流时&#xff0c;传统的语义分割模型往往显得力不从心。这些场景不仅要求算法具备像素级的精确…

作者头像 李华
网站建设 2026/6/10 5:22:00

因果提示优化(CPO)框架:提升大语言模型性能的关键技术

1. 因果提示优化&#xff08;CPO&#xff09;框架解析1.1 核心问题与创新点当前大语言模型&#xff08;LLM&#xff09;提示工程面临三个关键瓶颈&#xff1a;混淆偏差问题&#xff1a;传统方法将模型表现差异简单归因于提示修改&#xff0c;忽略了问题本身难度等混杂因素静态优…

作者头像 李华
网站建设 2026/6/9 3:16:06

MGKAN:多模态图网络在药物相互作用预测中的创新应用

1. 项目概述药物相互作用&#xff08;Drug-Drug Interaction, DDI&#xff09;预测是药物安全评估中的关键技术难点。在临床实践中&#xff0c;约15%的药物不良反应源于未被发现的药物相互作用&#xff0c;每年造成大量医疗事故和经济损失。传统DDI预测方法存在两个关键局限&am…

作者头像 李华
网站建设 2026/6/9 3:15:14

避开这些坑!ArcGIS成本路径分析从数据准备到结果可视化的保姆级指南

避开这些坑&#xff01;ArcGIS成本路径分析从数据准备到结果可视化的保姆级指南当你第一次在ArcGIS中完成成本路径分析时&#xff0c;那种成就感确实令人兴奋。但很快&#xff0c;现实会给你当头一棒——为什么我的路径绕了这么大一圈&#xff1f;为什么结果看起来这么不自然&a…

作者头像 李华