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

实现一个自定义 hook,用于强制刷新当前组件

写在前面

在 react 中,如果 state 数据发生变化,我们知道,会重新渲染该组件。

但是这个前提是我们需要依赖 state 数据的变化,那比如我们并不想定义 state,又或者说我们的操作不能引起 state 的变化,此时我们也想刷新组件怎么办?

这里我们就来实现一个自定义的 hooks,它的作用就是强制刷新当前组件

实现

如果想刷新组件,很重要的一点就是改变 state,当 state 的值发生变化时,组件会重新渲染。

一个重要的点:react hook 和组件的关系

  • 当在组件中使用一个自定义 hook 时,这个 hook 的状态和逻辑会成为该组件的一部分。
  • 具体来说,hook 内部的状态会被管理在使用这个 hook 的组件的状态树中。

通俗点说就是,我们自定义一个 hook,并且在组件中使用,那这个 hook 的 state 也会成为这个组件的一部分,也就是 hook 的 state 变化,会引起使用该 hook 的组件的变化。

说的太多可能还不明白,我们直接看代码。

hook

我们先自定义一个hook,实现原理就是利用 state 的变化,每次调用该 hook 的时候,state 的值都会发生变化。

  • 使用 useState 来存储一个计数器 tick。
  • setTick 每次调用时会增加计数器,这会触发组件重新渲染。
  • 使用 useCallback 确保 forceUpdate 函数在组件的整个生命周期内保持相同的引用。
  • 返回 forceUpdate 函数,以便在使用这个 hook 的组件中调用它。
import { useState, useCallback } from "react"; 
const useForceUpdate = () => { 
const [, setTick] = useState(0); 
// 只需要 setTick 函数,不需要 tick 值
const forceUpdate = useCallback(() => { 
setTick(tick => tick + 1); // 使用回调函数来确保更新基于最新状态 
}, []); 
return forceUpdate; // 返回 forceUpdate 函数 
}; 
export default useForceUpdate;

忽略状态值

这里的逗号(,)表示我们只解构出数组的第二个元素 setTick,而忽略第一个元素。

因为我们只需要 state 发生变化,不需要使用该 state,直接写为空也行。

const [, setTick] = useState(0);

组件使用

组件使用就比较简单了,直接引入 useForceUpdate,并在需要调用的时机执行即可,为了证明是否刷新,我们打印了一条语句并执行了随机时间显示到页面上,我们来看一下效果。

import React from "react"; 
import useForceUpdate from "./useForceUpdate";const MyComponent = () => { 
const forceUpdate = useForceUpdate(); 
// 获取 forceUpdate 函数 
const handleClick = () => { 
forceUpdate(); 
// 调用 forceUpdate 函数触发重新渲染 
}; 
console.log('组件刷新!'); // 每次重新渲染时打印日志 
return 
( 
<div>
<p>当前时间: {Date.now()}</p> 
<button onClick={handleClick}>强制刷新</button> 
</div> 
); 
}; 
export default MyComponent;

总结一下

为什么 MyComponent 会刷新​​​​​​?

当我们在 MyComponent 中使用 useForceUpdate hook 时,useForceUpdate 内部的状态 tick 会成为 MyComponent组件 的一部分。

调用 forceUpdate 函数会更新 tick 状态,触发 MyComponent 的重新渲染。

这是因为 react 的状态更新机制会导致使用该状态的组件重新渲染,即使这个状态在组件中没有直接使用。

相关文章:

实现一个自定义 hook,用于强制刷新当前组件

写在前面 在 react 中&#xff0c;如果 state 数据发生变化&#xff0c;我们知道&#xff0c;会重新渲染该组件。 但是这个前提是我们需要依赖 state 数据的变化&#xff0c;那比如我们并不想定义 state&#xff0c;又或者说我们的操作不能引起 state 的变化&#xff0c;此时…...

牛客热题:滑动窗口的最大值

&#x1f4df;作者主页&#xff1a;慢热的陕西人 &#x1f334;专栏链接&#xff1a;力扣刷题日记 &#x1f4e3;欢迎各位大佬&#x1f44d;点赞&#x1f525;关注&#x1f693;收藏&#xff0c;&#x1f349;留言 文章目录 牛客热题&#xff1a;滑动窗口的最大值题目链接方法一…...

Adobe产品安装目录修改

进入安装包目录&#xff0c;进入到products文件夹 编辑driver.xml文件 将“InstallDir”修改为你需要安装的软件的目录&#xff0c;我这里是修改到D:\Adobe目录 <DriverInfo> <ProductInfo> xxxxxxxxxxxxxxxxx </ProductInfo> 拷贝RequestInfo这部分…...

时间(空间)复杂度(结构篇)

目录 前言&#xff1a; 一、时间复杂度 1.1 时间复杂度的定义 1.2 时间复杂度的分析 表示方法&#xff1a; 1.3 常见的时间复杂度 1.4 时间复杂度的计算以及简单的分析 冒泡排序 折半查找&#xff08;二分查找&#xff09; 斐波那契数列&#xff08;递归&#xff09…...

react记录部署

导语 React中的核心概念 1 虚拟DOM&#xff08;Virtual DOM&#xff09; 2 Diff算法&#xff08;虚拟DOM的加速器&#xff0c;提升React性能的法宝&#xff09; React主要的原理 Virtual DOM 虚拟DOM; 提供了一种不同的而又强大的方式来更新DOM&#xff0c; 代替直接的DOM操…...

【计算机毕业设计】基于SSM+Vue的校园美食交流系统【源码+lw+部署文档】

目录 前 言 第1章 概述 1.1 研究背景 1.2 研究目的 1.3 研究内容 第二章 开发技术介绍 2.1 Java技术 2.2 Mysql数据库 2.3 B/S结构 2.4 SSM框架 第三章 系统分析 3.1 可行性分析 3.1.1 技术可行性 3.1.2 经济可行性 3.1.3 操作可行性 3.2 系统性能分析 3.3 系…...

「YashanDB迁移体验官」Mysql生产环境迁移至YashanDB数据库深度体验

「YashanDB迁移体验官」Mysql生产环境迁移至YashanDB数据库深度体验 1. 前言1.1 产品介绍1.2 产品架构1.3 产品规格1.3.1 数据库版本支持1.3.2 数据类型支持 2. YMP安装2.1 环境说明2.2 执行安装2.3 访问YMP2.3.1 YMP登录界面2.3.2 YMP迁移流程 3. YMP数据迁移3.1 创建数据源3.…...

qmt量化交易策略小白学习笔记第4期【qmt如何获取获取行情数据--内置python使用方法】

内置python使用方法 qmt更加详细的教程方法&#xff0c;会持续慢慢梳理。 也可找寻博主的历史文章&#xff0c;搜索关键词查看解决方案 &#xff01; 感谢关注&#xff0c;需免费开通量化回测与咨询实盘权限&#xff0c;可以和博主联系&#xff01; 获取历史行情与实时行情…...

XXE(XML外部实体注入)

1、XXE原理 XXE&#xff08;XML外部实体注入&#xff0c;XML External Entity) &#xff0c;在应用程序解析XML输入时&#xff0c;当允许引用外部实体时&#xff0c;可构造恶意内容&#xff0c;导致读取任意文件、探测内网端口、攻击内网网站、发起DoS拒绝服务攻击、执行系统命…...

kafka 案例

kafka 案例 目录概述需求&#xff1a; 设计思路实现思路分析1.kafka案例_API 带回调函数的生产者2.kafka案例_API生产者分区策略测试3.kafka案例_自定义分区的生产者4.kafka案例_API同步发送生产者5.kafka案例_API简单消费者5.kafka案例_API消费者重置offset 参考资料和推荐阅读…...

别被“涨价“带跑,性价比才是消费真理

文章来源&#xff1a;全食在线 “再不好好赚钱&#xff0c;连方便面也吃不起了。”这是昨天在热搜下&#xff0c;一位网友的留言。而热搜的内容&#xff0c;正是康师傅方便面即将涨价的消息。 01 传闻初现 昨天上午&#xff0c;朋友圈就有人放出康师傅方便面要涨价的消息&am…...

GEE深度学习——使用Tensorflow进行神经网络DNN土地分类

Tensorflow TensorFlow是一个开源的深度学习框架,由Google开发和维护。它提供了一个灵活的框架来构建和训练各种机器学习模型,尤其是深度神经网络模型。 TensorFlow的主要特点包括: 1. 它具有高度的灵活性,可以用于训练和部署各种类型的机器学习模型,包括分类、回归、聚…...

死锁示例(python、go)

Thread 1首先获取了资源A&#xff0c;然后尝试获取资源B&#xff0c;但此时资源B已经被Thread 2获取&#xff0c;因此Thread 1会一直等待。而Thread 2也类似&#xff0c;首先获取资源B&#xff0c;然后尝试获取资源A&#xff0c;但此时资源A已经被Thread 1获取&#xff0c;因此…...

Spring Cloud 面试题(五)

1. Eureka的自我保护模式是什么&#xff1f; Eureka的自我保护模式是一种应对网络异常的安全保护措施&#xff0c;旨在防止因网络分区或其他异常情况导致服务实例被错误地注销。当Eureka Server在短时间内丢失过多的客户端心跳时&#xff0c;会触发自我保护机制。以下是自我保…...

源码编译安装LAMP

1.LAMP介绍 LAMP架构是目前成熟的企业网站应用模式之一&#xff0c;指的是协同工作的一整套系统和相关软件&#xff0c;能够提供动态Web站点服务及其应用开发环境。LAMP是一个缩写词&#xff0c;具体包括Linux操作系统、Apache网站服务器、MySQL数据库服务器、PHP&#xff08;…...

html5网页-浏览器中实现高德地图定位功能

介绍 HTML5是当前Web开发中最常用的技术之一&#xff0c;而地图应用又是其中一个非常常见的需求。高德地图是国内最受欢迎的地图服务提供商之一&#xff0c;他们提供了一系列的API&#xff0c;方便开发者在自己的网站或应用中集成地图功能。 接下来我们如何使用HTML5浏览器和高…...

C从零开始实现贪吃蛇大作战

个人主页&#xff1a;星纭-CSDN博客 系列文章专栏 : C语言 踏上取经路&#xff0c;比抵达灵山更重要&#xff01;一起努力一起进步&#xff01; 有关Win32API的知识点在上一篇文章&#xff1a; 目录 一.地图 1.控制台基本介绍 2.宽字符 1.本地化 2.类项 3.setlocale函…...

国内外相机在LabVIEW图像处理的对比

概述 本文对比国内外相机在LabVIEW进行图像处理的区别&#xff0c;探讨各自的特点。国内相机如大恒和海康威视&#xff0c;具有较高性价比和本地化支持&#xff1b;国外品牌如Basler和FLIR则以高性能和稳定性著称。两者在驱动兼容性、图像质量和技术支持方面各有优势。 详细对…...

第四十五天 | 322.零钱兑换

题目&#xff1a;322.零钱兑换 尝试解答&#xff1a; 1.确定dp[j]含义&#xff1a;装满容量为j的背包所需要放的硬币个数为dp[j]; 2.动态转移方程&#xff1a;dp[j] dp[j - coins[i]] 1; 3.遍历顺序&#xff1a;本题应该为组合类题目&#xff0c;不考虑装入的顺序&#x…...

3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索

3D 生成重建011-LucidDreamer 优化SDS过平滑结果的一种探索 文章目录 0论文工作1论文方法2 效果 0论文工作 文本到3D生成的最新进展标志着生成模型的一个重要里程碑&#xff0c;为在各种现实场景中创建富有想象力的3D资产打开了新的可能性。虽然最近在文本到3D生成方面的进展…...

装饰模式(Decorator Pattern)重构java邮件发奖系统实战

前言 现在我们有个如下的需求&#xff0c;设计一个邮件发奖的小系统&#xff0c; 需求 1.数据验证 → 2. 敏感信息加密 → 3. 日志记录 → 4. 实际发送邮件 装饰器模式&#xff08;Decorator Pattern&#xff09;允许向一个现有的对象添加新的功能&#xff0c;同时又不改变其…...

【网络安全产品大调研系列】2. 体验漏洞扫描

前言 2023 年漏洞扫描服务市场规模预计为 3.06&#xff08;十亿美元&#xff09;。漏洞扫描服务市场行业预计将从 2024 年的 3.48&#xff08;十亿美元&#xff09;增长到 2032 年的 9.54&#xff08;十亿美元&#xff09;。预测期内漏洞扫描服务市场 CAGR&#xff08;增长率&…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

CocosCreator 之 JavaScript/TypeScript和Java的相互交互

引擎版本&#xff1a; 3.8.1 语言&#xff1a; JavaScript/TypeScript、C、Java 环境&#xff1a;Window 参考&#xff1a;Java原生反射机制 您好&#xff0c;我是鹤九日&#xff01; 回顾 在上篇文章中&#xff1a;CocosCreator Android项目接入UnityAds 广告SDK。 我们简单讲…...

04-初识css

一、css样式引入 1.1.内部样式 <div style"width: 100px;"></div>1.2.外部样式 1.2.1.外部样式1 <style>.aa {width: 100px;} </style> <div class"aa"></div>1.2.2.外部样式2 <!-- rel内表面引入的是style样…...

tree 树组件大数据卡顿问题优化

问题背景 项目中有用到树组件用来做文件目录&#xff0c;但是由于这个树组件的节点越来越多&#xff0c;导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多&#xff0c;导致的浏览器卡顿&#xff0c;这里很明显就需要用到虚拟列表的技术&…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

有限自动机到正规文法转换器v1.0

1 项目简介 这是一个功能强大的有限自动机&#xff08;Finite Automaton, FA&#xff09;到正规文法&#xff08;Regular Grammar&#xff09;转换器&#xff0c;它配备了一个直观且完整的图形用户界面&#xff0c;使用户能够轻松地进行操作和观察。该程序基于编译原理中的经典…...

sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!

简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求&#xff0c;并检查收到的响应。它以以下模式之一…...

佰力博科技与您探讨热释电测量的几种方法

热释电的测量主要涉及热释电系数的测定&#xff0c;这是表征热释电材料性能的重要参数。热释电系数的测量方法主要包括静态法、动态法和积分电荷法。其中&#xff0c;积分电荷法最为常用&#xff0c;其原理是通过测量在电容器上积累的热释电电荷&#xff0c;从而确定热释电系数…...