useRef是React中的一個 Hook使用Hook要記得import React, { useRef } from 'react'
之前好像忘記說了
主要有以下幾個功能:
範例
const inputRef = useRef(null)
const showDom = () => {
console.dir(inputRef.current)
//inputRef.current.value='123'
}
return(
<>
<div>
<input type="text" ref={inputRef} />
<button onClick={showDom}>show dom</button>
</div>
</>
)
為何要設置為null呢?
而相較原生的js寫法useRef更適合 React:因為 useRef 是與 React 的生命週期協同工作,它會自動更新引用。
import React, { useState, useRef } from 'react';
function Practise() {
const [showInput, setShowInput] = useState(true);
const inputRef = useRef(null);
const toggleInput = () => {
setShowInput(!showInput); // 控制 input 的顯示與隱藏
};
const focusInput = () => {
if (inputRef.current) {
inputRef.current.focus(); // 使用 useRef 訪問 DOM 元素
console.log(jsinput)
} else {
console.log('Input is not available');
}
};
const jsinput = document.getElementById('inp')
return (
<div>
<button onClick={toggleInput}>
{showInput ? 'Hide Input' : 'Show Input'}
</button>
{showInput && <input ref={inputRef} id="inp" type="text" />}
<button onClick={focusInput}>Focus Input</button>
</div>
);
}
export default Practise;
以上就會遇到一個問題:如果該元素是條件渲染
的(如 showInput 控制的 input 元素),則在初次渲染時,該元素還不存在。因此,當你使用 document.getElementById('btn') 來捕捉 input 元素時,這段代碼會在首次渲染時執行,但此時 DOM 中尚未有 id="btn" 的 input 元素,因此會返回 null。
在靜態或固定的畫面下,使用 document.getElementById() 來捕捉 DOM 元素可能不會有問題。然而,在 React 中使用 getElementById() 存在風險,特別是在條件渲染或頻繁重新渲染的情況下,因為 DOM 可能會被移除或重建。
useRef 更適合 React 的設計理念:useRef 是與 React 的生命週期和虛擬 DOM 緊密結合的,當 DOM 結構發生變化時,它會自動更新引用,保持引用最新的 DOM 元素。
避免打破 React 的單向數據流結構:React 強調單向數據流和聲明式編程。如果你頻繁使用 getElementById() 來直接操作 DOM,可能會打破 React 的數據流結構,導致應用行為變得不可預測。使用 useRef,則可以確保 React 對 DOM 操作的完整控制,同時避免這些潛在問題。
最近有點忙QAQ,今天先這樣