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

React 自定义Hook之usePrevious

概要

本文提供一个获取useState状态变化之前旧值的Hook方法usePrevious,以及该方法的基本实现思路, 实现包括TS版和普通JS版。

基本思路

usePrevious的核心原理,在于React Hooks的执行顺序和引用对象(ref)的持久化特性。

基本原理

初始阶段(页面加载):

  1. 组件挂载,useRef初始化一个ref对象,此时ref.curret 的值是undifined或传入的初始值;
  2. 组件渲染,usePrevious 返回undifined或传入的初始值;
  3. 组件渲染完成,执行监听函数useEffect,将ref.current跟新。

触发状态更新阶段:

调用setXX触发状态更新:

  1. 组件开始重新渲染;
  2. usePrevious再次执行,此时:useRef中的数据并未改变,因此返回旧值;所以在组件重新渲染阶段,可以取到旧值;
  3. 组件用新值完成渲染;
  4. 组件渲染完成后执行useEffect,更新ref.curret 。

代码实现

TS 版

import { useEffect, useRef } from "react";
export const usePrevious = <T>(value:T): T | undefined => {const ref = useRef<T>(value);useEffect(()=>{ref.current = value;}, [value]);return ref.current;
} 

JS版

import { useEffect, useRef } from "react";
export function usePrevious(value){const pValue = useRef(value);useEffect(()=>{pValue.current = value;}, [value]);return pValue.current;
}

结论

获取状态变化前的旧值,可以方便我们在普通的方法中,更好的监听响应式数据的变化,以便我们进行数据验证等操作。

http://www.xdnf.cn/news/601.html

相关文章:

  • CFS 的调度类型:普通调度 vs 组调度
  • 【中级软件设计师】语言处理程序(汇编程序、解释程序、编译程序)附软考真题
  • go语言优雅关机和优雅重启笔记
  • WEMOS LOLIN32
  • 第一部分笔试Day_01到Day24_每天两道OJ
  • 图解MCP:Model Context Protocol
  • 从零开始用Pytorch实现LLaMA 4的混合专家(MoE)模型
  • 【Java】接口interface学习
  • 国际数据加密算法(IDEA)详解
  • CentOS 10 /root 目录重新挂载到新分区槽
  • 【数据结构入门训练DAY-18】信息学奥赛一本通T1331-后缀表达式的值
  • URLDNS链构造
  • Android Studio 中 Drawable 详细全解
  • Android Drawable 目录下的 XML 图形文件详解
  • 在 Linux 上部署 .NET Core 应用并配置为开机自动启动
  • [操作系统] 信号
  • GO语言入门:常用数学函数2
  • rollup使用讲解
  • JUC复习及面试题学习
  • SpringBoot 统一功能处理
  • 智谱开源新一代GLM模型,全面布局AI智能体生态
  • 墙面刷完乳胶漆之后就有裂缝,有根治的办法吗?
  • Java面向对象进阶
  • BEVDet: High-Performance Multi-Camera 3D Object Detection in Bird-Eye-View
  • 年化26.9%的稳健策略|polars重构因子计算引擎(python策略下载)
  • AI——神经网络以及TensorFlow使用
  • 《汽车理论》第四章作业MATLAB部分
  • 传统深度学习架构和Transformer结构的区别
  • 从0开始搭建一套工具函数库,发布npm,支持commonjs模块es模块和script引入使用
  • uniapp-商城-29-vuex 关于系统状态的管理