Menu
×
   ❮     
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 来访问计数。

在你的电脑上运行它,并尝试在输入框中输入内容,查看应用程序渲染计数的增加。


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 />);

运行示例 »


跟踪状态变化

The 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 的当前值。


×

Contact Sales

If you want to use W3Schools services as an educational institution, team or enterprise, send us an e-mail:
[email protected]

Report Error

If you want to report an error, or if you want to make a suggestion, send us an e-mail:
[email protected]

W3Schools is optimized for learning and training. Examples might be simplified to improve reading and learning. Tutorials, references, and examples are constantly reviewed to avoid errors, but we cannot warrant full correctness of all content. While using W3Schools, you agree to have read and accepted our terms of use, cookie and privacy policy.

Copyright 1999-2024 by Refsnes Data. All Rights Reserved. W3Schools is Powered by W3.CSS.