網站首頁 編程語言 正文
總覽
當我們在一個函數組件中使用一個字符串作為ref
時,會產生"Function components cannot have string refs"錯誤。為了解決該錯誤,使用useRef()
鉤子來得到一個可變的ref
對象,這樣你就可以在組件中作為ref
使用。
這里有個示例用來展示錯誤是如何發生的。
// App.js export default function App() { // A string ref has been found within a strict mode tree. // ?? Function components cannot have string refs. // We recommend using useRef() instead. return ( <div> <input type="text" id="message" ref="msg" /> </div> ); }
上述代碼片段的問題在于,我們使用了字符串作為ref
。
useRef
為了解決該錯誤,使用useRef
鉤子來獲取可變的ref
對象。
// App.js import {useEffect, useRef} from 'react'; export default function App() { const refContainer = useRef(null); useEffect(() => { // ??? this is reference to input element console.log(refContainer.current); refContainer.current.focus(); }, []); return ( <div> <input type="text" id="message" ref={refContainer} /> </div> ); }
useRef()
鉤子可以被傳遞一個初始值作為參數。該鉤子返回一個可變的ref
對象,其.current
屬性被初始化為傳遞的參數。
需要注意的是,我們必須訪問ref
對象上的current
屬性,以獲得對我們設置了ref
屬性的input
元素的訪問。
當我們傳遞ref
屬性到元素上時,比如說,<input ref={myRef} />
。React將ref
對象上的.current
屬性設置為相應的DOM節點。
useRef
鉤子創建了一個普通的JavaScript對象,但在每次渲染時都給你相同的ref
對象。換句話說,它幾乎是一個帶有.current
屬性的記憶化對象值。
不會重新渲染
應該注意的是,當你改變ref
的current
屬性的值時,不會引起重新渲染。
例如,一個ref
不需要包含在useEffect
鉤子的依賴數組中,因為改變它的current
屬性不會引起重新渲染。
// App.js import {useEffect, useRef} from 'react'; export default function App() { const refContainer = useRef(null); const refCounter = useRef(0); useEffect(() => { // ??? this is reference to input element console.log(refContainer.current); refContainer.current.focus(); // ??? incrementing ref value does not cause re-render refCounter.current += 1; console.log(refCounter.current); }, []); return ( <div> <input type="text" id="message" ref={refContainer} /> </div> ); }
例子中的useEffect
鉤子只運行了2次,因為useRef
在其內容發生變化時并沒有通知我們。
改變對象的current
屬性并不會導致重新渲染。
原文鏈接:https://juejin.cn/post/7176261947384397880
相關推薦
- 2022-08-18 C/C++?extern和static的使用詳解_C 語言
- 2022-09-06 Django的restframework接口框架自定義返回數據格式的示例詳解_python
- 2022-12-24 Android全面屏適配方法詳解_Android
- 2022-07-21 Kafka3.0 消費者事務與數據積壓
- 2022-11-20 .Net中Task?Parallel?Library的基本用法_基礎應用
- 2023-11-19 如何卸載k3s?
- 2022-11-04 Android自定義View實現時鐘功能_Android
- 2023-12-13 SpringMVC——訪問action報404錯誤詳解
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支