useCallback



useCallback

av Ole Petter den 17. mars 2023

Sist oppdatert: 17 mars, 2023 kl 15:25

useCallback er en hook i React som returnerer en memorisert callback funksjon. Det sparer minne i applikasjonen fordi funksjonens verdier ikke trenger å rekalkuleres. useCallback kjøres kun når en av de avhengige variablene endres, som vist i tabellen til slutt i useCallback hooken, i dette tilfellet count og count2.

const sum = useCallback(() => count + count2, [count, count2]);

Kilde:

https://stackblitz.com/edit/vitejs-vite-bvtgfy?file=src/App.tsx

I koden i App.tsx er det tre variabler som kan endres, count, count2 og result, som er summen av count og count2. For å unngå unødvendig re-rendering, kan useCallback brukes til å oppdatere summen når enten count eller count2 endres.

  const [count, setCount] = useState(0);
  const [count2, setCount2] = useState(3);
  const [result, setResult] = useState(0);

For å oppdatere summen av count og count2, kan vi bruke useEffect, en annen React hook.

  useEffect(() => {
    setResult(sum);
  }, [sum]);

Siden useCallback forhindrer unødvendige ekstra oppdateringer, kan vi legge til variabelen sum returnert fra useCallback som en avhengig variabel, og få korrekt sum hver gang.

App.tsx

import { useCallback, useEffect, useState } from 'react';
import reactLogo from './assets/react.svg';
import viteLogo from '/vite.svg';
import './App.css';

function App() {
  const [count, setCount] = useState(0);
  const [count2, setCount2] = useState(3);
  const [result, setResult] = useState(0);

  const sum = useCallback(() => count + count2, [count, count2]);

  useEffect(() => {
    setResult(count + count2);
  }, [sum]);

  return (
    <div className="App">
      <div>
        <a href="https://vitejs.dev" target="_blank">
          <img src={viteLogo} className="logo" alt="Vite logo" />
        </a>
        <a href="https://reactjs.org" target="_blank">
          <img src={reactLogo} className="logo react" alt="React logo" />
        </a>
      </div>
      <h1>Vite + React</h1>
      <div className="card">
        <button onClick={() => setCount((count) => count + 1)}>
          count is {count}
        </button>
        <button onClick={() => setCount2((count2) => count2 + 1)}>
          count 2 is {count2}
        </button>
        <p>Sum count + count2 = {result}</p>
        <p>
          Edit <code>src/App.tsx</code> and save to test HMR
        </p>
      </div>
      <p className="read-the-docs">
        Click on the Vite and React logos to learn more
      </p>
    </div>
  );
}

export default App;

Legg igjen en kommentar