選單
×
   ❮     
HTML CSS JAVASCRIPT SQL PYTHON JAVA PHP HOW TO W3.CSS C C++ C# BOOTSTRAP REACT MYSQL JQUERY EXCEL XML DJANGO NUMPY PANDAS NODEJS R TYPESCRIPT ANGULAR GIT POSTGRESQL MONGODB ASP AI GO KOTLIN SASS VUE DSA GEN AI SCIPY AWS CYBERSECURITY DATA SCIENCE
     ❯   

React useRef Hook


The useRef Hook 允許你在渲染之間持久化值。

它可以用來儲存一個可變值,該值在更新時不會導致重新渲染。

它可以用來直接訪問 DOM 元素。


不引起重新渲染

如果我們嘗試使用 useState Hook 來計算我們的應用程式渲染了多少次,我們將陷入無限迴圈,因為這個 Hook 本身就會導致重新渲染。

為了避免這種情況,我們可以使用 useRef Hook。

示例

使用 useRef 來跟蹤應用程式渲染。

import { useState, useEffect, useRef } from "react";
import ReactDOM from "react-dom/client";

function App() {
  const [inputValue, setInputValue] = useState("");
  const count = useRef(0);

  useEffect(() => {
    count.current = count.current + 1;
  });

  return (
    <>
      <input
        type="text"
        value={inputValue}
        onChange={(e) => setInputValue(e.target.value)}
      />
      <h1>Render Count: {count.current}</h1>
    </>
  );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);

執行示例 »

useRef() 只返回一個項。它返回一個名為 current 的物件。

當我們初始化 useRef 時,我們設定初始值:useRef(0)

這就像這樣做:const count = {current: 0}。我們可以透過使用 count.current 來訪問 count。

在你的電腦上執行此程式碼,嘗試輸入內容,看看應用程式的渲染計數如何增加。


w3schools CERTIFIED . 2022

獲得認證!

完成 React 模組,完成練習,參加考試,並獲得 w3schools 認證!

$95 註冊

訪問 DOM 元素

通常,我們希望讓 React 處理所有 DOM 操作。

但是,在某些情況下,useRef 可以使用而不會引起問題。

在 React 中,我們可以在元素上新增一個 ref 屬性來直接在 DOM 中訪問它。

示例

使用 useRef 來聚焦輸入框

import { useRef } from "react";
import ReactDOM from "react-dom/client";

function App() {
  const inputElement = useRef();

  const focusInput = () => {
    inputElement.current.focus();
  };

  return (
    <>
      <input type="text" ref={inputElement} />
      <button onClick={focusInput}>Focus Input</button>
    </>
  );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);

執行示例 »


跟蹤狀態更改

useRef Hook 還可以用來跟蹤前一個狀態值。

這是因為我們可以在渲染之間持久化 useRef 值。

示例

使用 useRef 來跟蹤前一個狀態值

import { useState, useEffect, useRef } from "react";
import ReactDOM from "react-dom/client";

function App() {
  const [inputValue, setInputValue] = useState("");
  const previousInputValue = useRef("");

  useEffect(() => {
    previousInputValue.current = inputValue;
  }, [inputValue]);

  return (
    <>
      <input
        type="text"
        value={inputValue}
        onChange={(e) => setInputValue(e.target.value)}
      />
      <h2>Current Value: {inputValue}</h2>
      <h2>Previous Value: {previousInputValue.current}</h2>
    </>
  );
}

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(<App />);

執行示例 »

這次我們結合使用 useStateuseEffectuseRef 來跟蹤前一個狀態。

useEffect 中,每次透過在輸入框中輸入文字來更新 inputValue 時,我們都在更新 useRef 的當前值。


×

聯絡銷售

如果您想將 W3Schools 服務用於教育機構、團隊或企業,請傳送電子郵件給我們
sales@w3schools.com

報告錯誤

如果您想報告錯誤,或想提出建議,請傳送電子郵件給我們
help@w3schools.com

W3Schools 經過最佳化,旨在方便學習和培訓。示例可能經過簡化,以提高閱讀和學習體驗。教程、參考資料和示例會不斷審查,以避免錯誤,但我們無法保證所有內容的完全正確性。使用 W3Schools 即表示您已閱讀並接受我們的使用條款Cookie 和隱私政策

版權所有 1999-2024 Refsnes Data。保留所有權利。W3Schools 由 W3.CSS 提供支援