React-useRef

如果我們想在hooks里面獲同步取最新的值,那么則可以使用useRef, 關鍵源碼如下:


function mountRef<T>(initialValue: T): {|current: T|} {const hook = mountWorkInProgressHook();const ref = {current: initialValue};hook.memoizedState = ref;return ref;
}function updateRef<T>(initialValue: T): {|current: T|} {const hook = updateWorkInProgressHook();return hook.memoizedState;
}

可以看到,代碼實現非常簡單,創建一個ref對象,然后掛載到hook.memoizedState, 我們在修改的時候,就是直接修改ref.current。useRef其實就是提供一個穩定的變量,在組件的整個生命周期都是持續存在且是同一個引用。
注意:修改useRef返回的狀態不會引起UI的重渲染。

為什么在setTimeout的回調函數里面,拿不到useState的最新值?
主要有以下三點原因:
?? react 中的state,遵循著狀態不可變的原則,在setState之后,不會修改原來老的state的值,而是把新值重新賦值給hook.memoizedState
???對于react函數組件,其本身就是個render函數,每次重渲染之后,都會重新執行此函數,而每次執行的時候就會產生一個新的函數作用域。
???setTimeout的回調函數對hook.memoizedState形成了閉包引用,而在setState之后,都會重新執行組件函數,setTimeout 的回調函數會捕獲在 setTimeout 被創建時的狀態的快照,而不是最新的狀態。

但是為什么又能獲取useRef的最新值呢?
useRef本身并不能解決閉包引用的問題,但是它通過創建一個穩定的引用:

function mountRef<T>(initialValue: T): {|current: T|} {const hook = mountWorkInProgressHook();const ref = {current: initialValue};hook.memoizedState = ref;return ref;
}

mount在整個組件生命周期,只會觸發一次,因此只會創建一次。然后這也是為什么要創建一個對象,而對象上近僅創建一個current屬性來存儲數據,正是為了讓開發者在整個生命周期,拿到的始終是同一個引用,可以把它想象成當前組件域下的一個全局變量了,而修改數據僅僅在這個引用上的current屬性修改。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/76499.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/76499.shtml
英文地址,請注明出處:http://en.pswp.cn/web/76499.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

幽靈依賴與常見依賴管理

文章目錄 前言1. 演示&#xff1a;檢測和修復幽靈依賴步驟1&#xff1a;安裝 depcheck步驟2&#xff1a;在項目根目錄運行 depcheck可能的輸出步驟3&#xff1a;修復幽靈依賴 2. 依賴管理的好習慣 1. 場景設定現在有如下依賴需求&#xff1a; 2. 依賴沖突的表現3. 解決依賴沖突…

如何使用人工智能大模型,免費快速寫工作總結?

如何使用人工智能大模型&#xff0c;免費快速寫工作總結&#xff1f; 詳細學習視頻https://edu.csdn.net/learn/40406/666581

[Java實戰經驗]異常處理最佳實踐

一些好的異常處理實踐。 目錄 異常設計自定義異常為異常設計錯誤代碼&#xff08;狀態碼&#xff09;設計粒度全局異常處理異常日志信息保留 異常處理時機資源管理try-with-resources異常中的事務 異常設計 自定義異常 自定義異常設計&#xff0c;如業務異常定義BusinessExce…

Makefile 入門指南

Makefile 入門指南 最簡單的例子 單文件編譯 假設我們有一個main.cpp文件&#xff0c;最簡單的Makefile如下&#xff1a; # 最簡單的單文件編譯 # 目標:依賴文件 main: main.cpp# 編譯命令g main.cpp -o main使用步驟&#xff1a; 將上述內容保存為名為Makefile的文件&…

PyTorch數據操作基礎教程:從張量創建到高級運算

本文通過示例代碼全面講解PyTorch中張量的基本操作&#xff0c;包含創建、運算、廣播機制、索引切片等核心功能&#xff0c;并提供完整的代碼和輸出結果。 1. 張量創建與基本屬性 import torch# 創建連續數值張量 x torch.arange(12, dtypetorch.float32) print("原始張…

【Redis】Redis中的常見數據類型(一)

文章目錄 前言一、Redis前置知識1. 全局命令2、數據結構和內部編碼3. 單線程架構 二、String 字符串1. 常見命令2. 計數命令3.其他命令4. 內部編碼5. 典型使用場景 三、Hash哈希1. 命令2.內部編碼3. 使用場景4. 緩存方式對比 結語 前言 Redis 提供了 5 種數據結構&#xff0c;…

Windows 中使用 `netstat` 命令查看端口占用

在 Windows 系統中&#xff0c;可以通過 netstat 命令來查看當前系統的網絡連接以及端口的占用情況。以下是關于該命令的具體說明&#xff1a; #### 使用方法 1. **查看所有端口及其狀態** 可以通過以下命令查看系統中的所有活動連接和監聽端口&#xff1a; bash net…

23種設計模式-結構型模式之裝飾器模式(Java版本)

Java 裝飾器模式&#xff08;Decorator Pattern&#xff09;詳解 &#x1f381; 什么是裝飾器模式&#xff1f; 裝飾器模式是一種結構型設計模式&#xff0c;允許向一個對象動態添加新的功能&#xff0c;而不改變其結構。 &#x1f9f1; 你可以想象成在原有功能上“包裹”一…

解決模擬器打開小紅書設備異常問題

解決模擬器打開小紅書設備異常問題 解決模擬器打開小紅書設備異常問題和無法打開問題 解決模擬器打開小紅書設備異常問題和無法打開問題 問題描述 最近有用戶反饋在模擬器上無法正常登錄和打開小紅書APP&#xff0c;系統提示"設備異常"錯誤。本文將詳細介紹如何通過…

論文閱讀:2025 arxiv AI Alignment: A Comprehensive Survey

總目錄 大模型安全相關研究&#xff1a;https://blog.csdn.net/WhiffeYF/article/details/142132328 AI Alignment: A Comprehensive Survey 人工智能對齊&#xff1a;全面調查 https://arxiv.org/pdf/2310.19852 https://alignmentsurvey.com/ https://www.doubao.com/cha…

精益數據分析(1/126):從《精益數據分析》探尋數據驅動增長之道

精益數據分析&#xff08;1/126&#xff09;&#xff1a;從《精益數據分析》探尋數據驅動增長之道 在當今數字化時代&#xff0c;數據無疑是企業發展的關鍵驅動力&#xff0c;對于競爭激烈的程序化廣告行業更是如此。最近我在研讀《精益數據分析》這本書&#xff0c;收獲頗豐&…

第五節:React Hooks進階篇-如何用useMemo/useCallback優化性能

反模式&#xff1a;濫用導致的內存開銷React 19編譯器自動Memoization原理 React Hooks 性能優化進階&#xff1a;從手動到自動 Memoization &#xff08;基于 React 18 及以下版本&#xff0c;結合 React 19 新特性分析&#xff09; 一、useMemo/useCallback 的正確使用場景…

windows server C# IIS部署

1、添加IIS功能 windows server 2012、windows server 2016、windows server 2019 說明&#xff1a;自帶的是.net 4.5 不需要安裝.net 3.5 盡量使用 windows server 2019、2016高版本&#xff0c;低版本會出現需要打補丁的問題 2、打開IIS 3、打開iis應用池 .net 4.5 4、添…

Elasticsearch的Java客戶端庫QueryBuilders查詢方法大全

matchAllQuery 使用方法&#xff1a;創建一個查詢&#xff0c;匹配所有文檔。 示例&#xff1a;QueryBuilders.matchAllQuery() 注意事項&#xff1a;這種查詢不加任何條件&#xff0c;會返回索引中的所有文檔&#xff0c;可能會影響性能&#xff0c;特別是文檔數量很多時。 ma…

C#進階學習(六)單向鏈表和雙向鏈表,循環鏈表(下)循環鏈表

目錄 &#x1f4ca; 鏈表三劍客&#xff1a;特性全景對比表 一、循環鏈表節點類 二、循環鏈表的整體設計框架 三、循環列表中的重要方法&#xff1a; &#xff08;1&#xff09;頭插法&#xff0c;在頭結點前面插入新的節點 &#xff08;2&#xff09;尾插法實現插入元素…

交換網絡基礎

學習目標 掌握交換機的基本工作原理 掌握交換機的基本配置 交換機的基本工作原理 交換機是局域網&#xff08;LAN&#xff09;中實現數據高效轉發的核心設備&#xff0c;工作在 數據鏈路層&#xff08;OSI 模型第二層&#xff09;&#xff0c;其基本工作原理可概括為 “學習…

科學研究:怎么做

科研&#xff08;科學研究&#xff09;?? 是指通過系統化的方法&#xff0c;探索自然、社會或人文領域的未知問題&#xff0c;以發現新知識、驗證理論或解決實際問題的活動。它的核心是??基于證據的探索與創新??&#xff0c;旨在推動人類認知和技術的進步。 科研的核心要…

算法題(128):費解的開關

審題&#xff1a; 本題需要我們將多組測試用例中拉燈數小于等于6的最小拉燈數輸出&#xff0c;若拉燈數最小值仍大于6&#xff0c;則輸出-1 思路&#xff1a; 方法一&#xff1a;二進制枚舉 首先我們先分析一下基本特性&#xff1a; 1.所有的燈不可能重復拉&#xff1a;若拉的數…

MFC文件-屏幕錄像

下載本文件 本文件將獲取屏幕圖像數據的所有代碼整合到兩個文件中&#xff08;ScreenRecorder.h和ScreenRecorder.cpp&#xff09;&#xff0c;使獲取屏幕圖像數據變得簡單。輸出IYUV視頻流。還可以獲取系統播放的聲音&#xff0c;輸出PCM音頻流。由于使用了MFC類&#xff0c;本…

0801ajax_mock-網絡ajax請求1-react-仿低代碼平臺項目

0 vite配置proxy代理 vite.config.ts代碼如下圖所示&#xff1a; import { defineConfig } from "vite"; import react from "vitejs/plugin-react";// https://vite.dev/config/ export default defineConfig({plugins: [react()],server: {proxy: {&qu…