網站首頁 編程語言 正文
總覽
當我們在一個函數組件中使用一個字符串作為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-01-12 npm ERR 部署meteor時npm install出錯問題解決
- 2023-01-17 Python無權點文件轉化成鄰接矩陣方式_python
- 2022-09-22 判斷數據類型的五種方法
- 2022-09-13 centos環境下nginx高可用集群的搭建指南_nginx
- 2022-10-07 Docker超詳細講解鏡像操作_docker
- 2022-07-24 示例剖析golang中的CSP并發模型_Golang
- 2022-03-05 centos7下搭建DNS服務器介紹_Linux
- 2024-01-06 關于class.getClassLoader().getResourceAsStream()和cla
- 最近更新
-
- 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同步修改后的遠程分支