A RetroSearch Logo

Home - News ( United States | United Kingdom | Italy | Germany ) - Football scores

Search Query:

Showing content from https://react.dev/reference/react/useRef below:

useRef – React

useRef is a React Hook that lets you reference a value that’s not needed for rendering.

const ref = useRef(initialValue)

Reference useRef(initialValue)

Call useRef at the top level of your component to declare a ref.

import { useRef } from 'react';

function MyComponent() {

const intervalRef = useRef(0);

const inputRef = useRef(null);

// ...

See more examples below.

Parameters Returns

useRef returns an object with a single property:

On the next renders, useRef will return the same object.

Caveats Usage Referencing a value with a ref

Call useRef at the top level of your component to declare one or more refs.

import { useRef } from 'react';

function Stopwatch() {

const intervalRef = useRef(0);

// ...

useRef returns a ref object with a single current property initially set to the initial value you provided.

On the next renders, useRef will return the same object. You can change its current property to store information and read it later. This might remind you of state, but there is an important difference.

Changing a ref does not trigger a re-render. This means refs are perfect for storing information that doesn’t affect the visual output of your component. For example, if you need to store an interval ID and retrieve it later, you can put it in a ref. To update the value inside the ref, you need to manually change its current property:

function handleStartClick() {

const intervalId = setInterval(() => {

// ...

}, 1000);

intervalRef.current = intervalId;

}

Later, you can read that interval ID from the ref so that you can call clear that interval:

function handleStopClick() {

const intervalId = intervalRef.current;

clearInterval(intervalId);

}

By using a ref, you ensure that:

Changing a ref does not trigger a re-render, so refs are not appropriate for storing information you want to display on the screen. Use state for that instead. Read more about choosing between useRef and useState.

Examples of referencing a value with useRef

Example 1 of 2:

Click counter

This component uses a ref to keep track of how many times the button was clicked. Note that it’s okay to use a ref instead of state here because the click count is only read and written in an event handler.

import { useRef } from 'react';

export default function Counter() {
  let ref = useRef(0);

  function handleClick() {
    ref.current = ref.current + 1;
    alert('You clicked ' + ref.current + ' times!');
  }

  return (
    <button onClick={handleClick}>
      Click me!
    </button>
  );
}

If you show {ref.current} in the JSX, the number won’t update on click. This is because setting ref.current does not trigger a re-render. Information that’s used for rendering should be state instead.

Pitfall

Do not write or read ref.current during rendering.

React expects that the body of your component behaves like a pure function:

Reading or writing a ref during rendering breaks these expectations.

function MyComponent() {

// ...

// 🚩 Don't write a ref during rendering

myRef.current = 123;

// ...

// 🚩 Don't read a ref during rendering

return <h1>{myOtherRef.current}</h1>;

}

You can read or write refs from event handlers or effects instead.

function MyComponent() {

// ...

useEffect(() => {

// ✅ You can read or write refs in effects

myRef.current = 123;

});

// ...

function handleClick() {

// ✅ You can read or write refs in event handlers

doSomething(myOtherRef.current);

}

// ...

}

If you have to read or write something during rendering, use state instead.

When you break these rules, your component might still work, but most of the newer features we’re adding to React will rely on these expectations. Read more about keeping your components pure.

Manipulating the DOM with a ref

It’s particularly common to use a ref to manipulate the DOM. React has built-in support for this.

First, declare a ref object with an initial value of null:

import { useRef } from 'react';

function MyComponent() {

const inputRef = useRef(null);

// ...

Then pass your ref object as the ref attribute to the JSX of the DOM node you want to manipulate:

// ...

return <input ref={inputRef} />;

After React creates the DOM node and puts it on the screen, React will set the current property of your ref object to that DOM node. Now you can access the <input>’s DOM node and call methods like focus():

function handleClick() {

inputRef.current.focus();

}

React will set the current property back to null when the node is removed from the screen.

Read more about manipulating the DOM with refs.

Examples of manipulating the DOM with useRef

Example 1 of 4:

Focusing a text input

In this example, clicking the button will focus the input:

import { useRef } from 'react';

export default function Form() {
  const inputRef = useRef(null);

  function handleClick() {
    inputRef.current.focus();
  }

  return (
    <>
      <input ref={inputRef} />
      <button onClick={handleClick}>
        Focus the input
      </button>
    </>
  );
}

Avoiding recreating the ref contents

React saves the initial ref value once and ignores it on the next renders.

function Video() {

const playerRef = useRef(new VideoPlayer());

// ...

Although the result of new VideoPlayer() is only used for the initial render, you’re still calling this function on every render. This can be wasteful if it’s creating expensive objects.

To solve it, you may initialize the ref like this instead:

function Video() {

const playerRef = useRef(null);

if (playerRef.current === null) {

playerRef.current = new VideoPlayer();

}

// ...

Normally, writing or reading ref.current during render is not allowed. However, it’s fine in this case because the result is always the same, and the condition only executes during initialization so it’s fully predictable.

Deep Dive How to avoid null checks when initializing useRef later

If you use a type checker and don’t want to always check for null, you can try a pattern like this instead:

function Video() {

const playerRef = useRef(null);

function getPlayer() {

if (playerRef.current !== null) {

return playerRef.current;

}

const player = new VideoPlayer();

playerRef.current = player;

return player;

}

// ...

Here, the playerRef itself is nullable. However, you should be able to convince your type checker that there is no case in which getPlayer() returns null. Then use getPlayer() in your event handlers.

Troubleshooting I can’t get a ref to a custom component

If you try to pass a ref to your own component like this:

const inputRef = useRef(null);

return <MyInput ref={inputRef} />;

You might get an error in the console:

TypeError: Cannot read properties of null

By default, your own components don’t expose refs to the DOM nodes inside them.

To fix this, find the component that you want to get a ref to:

export default function MyInput({ value, onChange }) {

return (

<input

value={value}

onChange={onChange}

/>

);

}

And then add ref to the list of props your component accepts and pass ref as a prop to the relevent child built-in component like this:

function MyInput({ value, onChange, ref }) {

return (

<input

value={value}

onChange={onChange}

ref={ref}

/>

);

};

export default MyInput;

Then the parent component can get a ref to it.

Read more about accessing another component’s DOM nodes.


RetroSearch is an open source project built by @garambo | Open a GitHub Issue

Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo

HTML: 3.2 | Encoding: UTF-8 | Version: 0.7.4