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

自定义hooks之useLastState、useSafeState

自定义hooks之useLastState、useSafeState
useLastState

在某些情况下,可能需要知道状态的历史值,例如,希望在状态变化时执行某些操作,但又需要访问上一个状态的值,以便进行比较或其他操作。自定义 React Hook 可以帮助我们封装和重用组件逻辑。这里介绍的useLastState Hook 可以用于跟踪组件状态的历史变化,可以获取上一个状态的值。

以下是一个实现 useLastState Hook 的示例:

import { useState, useEffect } from 'react';function useLastState(initialState) {const [state, setState] = useState(initialState);const [lastState, setLastState] = useState(initialState);// 使用 useEffect 来监听 state 的变化,并在 state 变化时更新 lastStateuseEffect(() => {setLastState(state);}, [state]);// 返回一个包含当前 state 和上一个 state 的数组return [state, lastState, setState];
}export default useLastState;

上面的 useLastState Hook 接受一个初始状态值作为参数,并返回一个包含当前状态、上一个状态以及一个更新状态的函数的数组。

使用这个 Hook 的示例:

import React from 'react';
import useLastState from './useLastState';function MyComponent() {const [count, lastCount, setCount] = useLastState(0);const handleIncrement = () => {setCount(count + 1);};return (<div><p>Current Count: {count}</p><p>Last Count: {lastCount}</p><button onClick={handleIncrement}>Increment</button></div>);
}export default MyComponent;

在上述示例中,MyComponent 使用 useLastState Hook 来跟踪 count 的状态,并在界面上显示当前计数和上一个计数的值。当点击 “Increment” 按钮时,count 会增加,同时 lastCount 会更新为前一个状态的值。

使用场景

  1. 图表组件:当需要在图表组件中跟踪数据的历史变化,以便在数据变化时执行比较或动画效果时,可以使用 useLastState。例如,在绘制图表时,可以比较当前数据和上一次数据,以确定何时触发图表的动画效果。

  2. 计数器组件:在计数器组件中,可能希望显示当前计数值以及上一次计数值,以便用户可以看到计数的变化情况。

  3. 表格排序:当用户点击表格列标题进行排序时,可以使用 useLastState 来跟踪上一次的排序状态,以确定排序的方向(升序或降序),并在表格中显示排序箭头。

useSafeState

useSafeState 是一个自定义 React Hook,用于确保在组件卸载后不再更新组件状态。这是为了解决异步操作(如数据请求或定时器)可能在组件卸载后仍然触发状态更新的常见问题,有助于处理异步操作和组件生命周期的常见问题的方式,确保组件卸载后不再更新状态,提高了代码的稳定性。

以下是一个实现 useSafeState Hook 的示例:

import { useState, useEffect, useCallback } from 'react';function useSafeState(initialState) {const [state, setState] = useState(initialState);const isMounted = useRef(true);useEffect(() => {isMounted.current = true;return () => {isMounted.current = false;};}, []);const safeSetState = useCallback((newState) => {if (isMounted.current) {setState(newState);}},[setState]);return [state, safeSetState];
}export default useSafeState;

使用这个 Hook 的示例:

import React, { useEffect } from 'react';
import useSafeState from './useSafeState';function MyComponent() {const [count, setCount] = useSafeState(0);useEffect(() => {const timer = setInterval(() => {setCount((prevCount) => prevCount + 1);}, 1000);return () => {clearInterval(timer); // 确保在组件卸载时清除定时器};}, [setCount]);return (<div><p>Count: {count}</p></div>);
}export default MyComponent;

在上述示例中,useSafeState Hook 用于跟踪计数的状态,同时在组件卸载时清除定时器。这确保了即使在组件卸载后,定时器仍然触发状态更新的情况下,不会引发 React 的警告或错误。

使用场景

  1. 数据请求:在进行数据请求时,如果请求返回数据需要更新组件的状态,但在请求期间用户可能离开当前页面或组件已卸载,为了避免在组件卸载后更新状态而导致错误,可以使用 useSafeState

  2. 定时器:在使用定时器执行周期性任务时,如果组件在定时器触发时已经卸载,为了防止更新已卸载组件的状态,可以使用 useSafeState 来确保定时器回调函数不会触发状态更新。

  3. 事件监听器:在添加 DOM 事件监听器时,如果组件卸载时没有正确移除事件监听器,可能会导致内存泄漏或不稳定的行为。useSafeState 可以用于确保在组件卸载时不再触发事件监听器的回调函数。

本文使用 文章同步助手 同步

相关文章:

自定义hooks之useLastState、useSafeState

自定义hooks之useLastState、useSafeState useLastState 在某些情况下&#xff0c;可能需要知道状态的历史值&#xff0c;例如&#xff0c;希望在状态变化时执行某些操作&#xff0c;但又需要访问上一个状态的值&#xff0c;以便进行比较或其他操作。自定义 React Hook 可以帮…...

前端判断: []+[], []+{}, {}+[], {}+{}

本质: 二元操作符规则 一般判断规则: 如果操作数是对象,则对象会转换为原始值如果其中一个操作数是字符串的话,另一个操作数也会转换成字符串,进行字符串拼接否则,两个操作数都将转换成数字或NaN,进行加法操作 转为原始数据类型的值的方法: Symbol.ToPrimitiveObject.protot…...

el-input-number/el-input 实现实时输入数字转换千分位(失焦时展示千分位)

el-input-number/el-input 实现实时输入数字转换千分位(失焦时展示千分位) 我把封装指令的代码放在了main.js,代码如下 // 金额展示千分位 Vue.directive("thousands", {inserted: function(el, binding) {// debugger// 获取input节点if (el.tagName.toLocaleUppe…...

一篇博客学会系列(2)—— C语言中的自定义类型 :结构体、位段、枚举、联合体

目录 前言 1、结构体 1.1、结构体类型的声明 1.2、特殊的结构体类型声明 1.3、结构体的自引用 1.4、结构体的定义和初始化 1.5、结构体成员变量的调用 1.6、结构体内存对齐 1.6.1、offsetof 1.6.2、结构体大小的计算 1.6.3、为什么存在内存对齐&#xff1f; 1.7、…...

KongA 任意用户登录漏洞分析

KongA 简介 KongA 介绍 KongA 是 Kong 的一个 GUI 工具。GitHub 地址是 https://github.com/pantsel/konga 。 KongA 概述 KongA 带来的一个最大的便利就是可以很好地通过UI观察到现在 Kong 的所有的配置&#xff0c;并且可以对于管理 Kong 节点 漏洞成因 未设置TOKEN_SECRE…...

吉力宝:智能科技鞋品牌步力宝引领传统产业创新思维

在现代经济环境下&#xff0c;市场经济下产品的竞争非常的激烈&#xff0c;如果没有营销&#xff0c;产品很可能不被大众认可&#xff0c;酒香也怕巷子深&#xff0c;许多传统产业不得不面临前所未有的挑战。而为了冲出这个“巷子”&#xff0c;许多企业需要采用创新思维&#…...

【IPC 通信】信号处理接口 Signal API(1)

收发信号思想是 Linux 程序设计特性之一&#xff0c;一个信号可以认为是一种软中断&#xff0c;通过用来向进程通知异步事件。 本文讲述的 信号处理内容源自 Linux man。本文主要对各 API 进行详细介绍&#xff0c;从而更好的理解信号编程。 信号概述 遵循 POSIX.1&#xff0c;…...

使用GDIView排查GDI对象泄漏导致的程序UI界面绘制异常问题

目录 1、问题说明 2、初步分析 3、查看任务管理器&#xff0c;并使用GDIView工具分析 4、GDIView可能对Win10兼容性不好&#xff0c;显示的GDI对象个数不太准确 5、采用历史版本比对法&#xff0c;确定初次出现问题的时间点&#xff0c;并查看前一天的代码修改记录 6、将…...

蓝桥等考Python组别一级001

第一部分:选择题 1、Python L1 (15分) 下面哪个不是Python的编程环境?( ) Python在线编程IDLEPyCharmScratch正确答案:D 2、Python L1(15分) 世界上第一台通用电子计算机ENIAC是在( )诞生的。 美国英国日本德国正确答案:A 3、Python L1(20分) 关于P…...

Unity之Hololens2开发 如何接入的MRTK OpenXR Plugin

一.前言 什么是Hololens? Hololens是由微软开发的一款混合现实头戴式设备,它将虚拟内容与现实世界相结合,为用户提供了沉浸式的AR体验。Hololens通过内置的传感器和摄像头,能够感知用户的环境,并在用户的视野中显示虚拟对象。这使得用户可以与虚拟内容进行互动,将数字信…...

Ubuntu系统Linux内核安装和使用

安装&#xff1a; 检查树莓派Linux版本&#xff0c;我的是6.1 uname -r 内核下载链接&#xff1a; Raspberry Pi GitHub 找对应版本下载 导入之后&#xff0c;解压安装即可 unzip linux-rpi-6.1.y.zip 其他内容 treee 指令安装 sudo apt-get install tree 使用这…...

数学术语之源——群同态的“核(kernel)”

1. “kernel”这个术语在群论中的起源 Ivar Fredholm 在 1903 年的第27期Acta Math 数学学报发表的一篇关于“积分方程(INTEGRAL EQUATIONS)”的著名论文(“关于一类函数方程(Sur une classe des quations fonctionnelles)”)中使用了法语“noyau(核)”(365-390页)。 David …...

defcon-quals 2023 crackme.tscript.dso wp

将dso文件放到data/ExampleModule目录下&#xff0c;编辑ExampleModule.tscript文件 function ExampleModule::onCreate(%this) { trace(true); exec("./crackme"); __main("aaaaaaaa"); quit(); } 然后点击主目录下的Torque3D-debug.bat就可以在生成的c…...

前端开发 vs. 后端开发:编程之路的选择

文章目录 前端开发&#xff1a;用户界面的创造者1. HTML/CSS/JavaScript&#xff1a;2. 用户体验设计&#xff1a;3. 响应式设计&#xff1a;4. 前端框架&#xff1a; 后端开发&#xff1a;数据和逻辑的构建者1. 服务器端编程&#xff1a;2. 数据库&#xff1a;3. 安全性&#…...

算法练习4——删除有序数组中的重复项 II

LeetCode 80 删除有序数组中的重复项 II 给你一个有序数组 nums &#xff0c;请你 原地 删除重复出现的元素&#xff0c;使得出现次数超过两次的元素只出现两次 &#xff0c;返回删除后数组的新长度。 不要使用额外的数组空间&#xff0c;你必须在 原地 修改输入数组 并在使用 …...

【C++进阶(六)】STL大法--栈和队列深度剖析优先级队列适配器原理

&#x1f493;博主CSDN主页:杭电码农-NEO&#x1f493;   ⏩专栏分类:C从入门到精通⏪   &#x1f69a;代码仓库:NEO的学习日记&#x1f69a;   &#x1f339;关注我&#x1faf5;带你学习C   &#x1f51d;&#x1f51d; 栈和队列 1. 前言2. 栈和队列的接口函数熟悉3. …...

linux opensuse使用mtk烧录工具flashtool

环境 linux发行版&#xff1a;opensuse leap 15.5 工具&#xff1a;SP_Flash_Tool_Selector_exe_Linux_v1.2316.00.100.rar 或其他版本 目标&#xff1a;mtk设备 下载链接 https://download.csdn.net/download/zmlovelx/88382784 或网络搜索。 使用 opensuse可直接解压后使…...

Visio如何对文本打下标、上标,以及插入公式编辑器等问题(已解决)

解决这个问题的本质问题&#xff0c;就是在Visio中插入公式编辑器&#xff08;这不是visio的常用命令&#xff0c;需要添加&#xff09;。 打开Visio--》文件--选项 点击选项&#xff0c;弹出对话框。在自定义功能区中&#xff0c;点击 常用命令&#xff0c;在下拉选项中&#…...

快速将iPhone大量照片快速传输到电脑的办法!

很多使用iPhone 的朋友要将照片传到电脑时&#xff0c;第一时间都只想到用iTunes 或iCloud&#xff0c;但这2个工具真的都非常难用&#xff0c;今天小编分享牛学长苹果数据管理工具的照片传输功能&#xff0c;他可以快速的将iPhone照片传输到电脑上&#xff0c;并且支持最新的i…...

TCP/IP协议簇包含的协议

应用层&#xff08;Application Layer&#xff09;&#xff1a; HTTP&#xff08;Hypertext Transfer Protocol&#xff09;&#xff1a;用于Web浏览器和Web服务器之间的通信。HTTPS&#xff08;Hypertext Transfer Protocol Secure&#xff09;&#xff1a;安全的HTTP版本&…...

CTF逆向新手必看:用Python脚本搞定AES、Z3、Base64这些常见加密(附避坑指南)

CTF逆向实战手册&#xff1a;Python脚本自动化破解高频加密算法 1. 逆向工程中的加密算法挑战 在CTF逆向题目中&#xff0c;加密算法就像迷宫中的隐形墙壁&#xff0c;看似无形却处处设障。最近三年赛事数据显示&#xff0c;AES、Base系列和Z3约束求解三类题型出现频率合计占比…...

从电源拓扑到代码:STM32F103驱动移相全桥的软硬件协同设计实战

从电源拓扑到代码&#xff1a;STM32F103驱动移相全桥的软硬件协同设计实战 在中小功率开关电源和电机驱动领域&#xff0c;移相全桥拓扑因其优异的软开关特性和高效率表现&#xff0c;成为工程师们的首选方案之一。然而&#xff0c;将教科书上的拓扑原理转化为实际可用的电源产…...

理解“变异”的奥秘——集中趋势与变异性度量详解

如果说统计学是在“用数据讲故事”&#xff0c;那么集中趋势回答的是&#xff1a;“这个故事大概讲到了哪里&#xff1f;”而变异性回答的是&#xff1a;“这个故事有多分散、多不稳定、多不一样&#xff1f;”很多初学者学统计时&#xff0c;最先记住的是“平均数”“中位数”…...

对比自行维护多个API与使用Taotoken聚合平台在运维复杂度上的差异

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 对比自行维护多个API与使用Taotoken聚合平台在运维复杂度上的差异 在构建基于大模型的应用时&#xff0c;开发者常常需要接入多个不…...

别再折腾Yum源了!用Docker Desktop 10分钟搞定Vulhub靶场(附一键脚本)

10分钟极速搭建Vulhub靶场&#xff1a;Docker Desktop全攻略 在网络安全学习和渗透测试实践中&#xff0c;Vulhub作为开箱即用的漏洞环境集合&#xff0c;已经成为安全研究者的必备工具。然而&#xff0c;传统的Linux环境配置过程往往让初学者望而却步——复杂的Yum源配置、漫…...

3分钟完成Honey Select 2中文汉化:免费增强补丁终极使用指南

3分钟完成Honey Select 2中文汉化&#xff1a;免费增强补丁终极使用指南 【免费下载链接】HS2-HF_Patch Automatically translate, uncensor and update HoneySelect2! 项目地址: https://gitcode.com/gh_mirrors/hs/HS2-HF_Patch 还在为Honey Select 2的界面语言障碍而…...

【亲测免费】 工业自动化+Modbus通讯协议+libmodbus开源库+Windows x64编译教程

工业自动化Modbus通讯协议libmodbus开源库Windows x64编译教程 【下载地址】工业自动化Modbus通讯协议libmodbus开源库Windowsx64编译教程 本资源适用于使用libmodbus开源库进行数据通信过程中的环境搭建过程。由于最新版本的libmodbus并不能通过官网提供的教程实现Windows下的…...

51c自动驾驶~合集57

我自己的原文哦~ https://blog.51cto.com/whaosoft/13960249 #端到端自动驾驶算法实现原理 1从传感器数据到控制策略的端到端方法 端到端自动驾驶基本流程: (1)子任务模型被更大规模的神经网络模型取代,最终即为端到端神经网络模型; (2)…...

Cling实时编码音乐应用:探索编程与艺术的跨界融合

Cling实时编码音乐应用&#xff1a;探索编程与艺术的跨界融合 【免费下载链接】cling The interactive C interpreter Cling 项目地址: https://gitcode.com/gh_mirrors/cli/cling Cling作为一款强大的交互式C解释器&#xff0c;不仅能提升编程效率&#xff0c;更能成为…...

无人机巡检避坑指南:用YOLOv5n做罂粟识别,这些光照和遮挡问题怎么解决?

无人机巡检实战&#xff1a;YOLOv5n在复杂环境下的罂粟识别优化策略 清晨的露珠还挂在叶片上&#xff0c;无人机已经盘旋在田野上空。对于从事智能巡检的工程师来说&#xff0c;这样的场景再熟悉不过——但随之而来的挑战也令人头疼&#xff1a;强烈的晨光让部分区域过曝&#…...