React hooks

Starter pack

Vediamo con React Three Fiber quali React hooks useremo comunemente e come utilizzarli evitando errori comuni.

Se non conosci i React hooks, ti consiglio di leggere prima la documentazione ufficiale.

useState

useState ti permette di creare una variabile di stato e una funzione per aggiornarla.

const [color, setColor] = useState("white");

Restituisce un array con due elementi:

  • la variabile di stato
  • la funzione per aggiornarla.

Puoi utilizzarlo in questo modo:

import { useState } from "react";

// ...

const Cube = (props) => {
  const [color, setColor] = useState("white");

  useControls({
    changeColorToRed: button(() => setColor("red")),
    changeColorToBlue: button(() => setColor("blue")),
    changeColorToGreen: button(() => setColor("green")),
  });
  return (
    <mesh {...props}>
      <boxGeometry />
      <meshStandardMaterial color={color} />
    </mesh>
  );
};

// ...

Ogni volta che clicchi su uno dei pulsanti, cambia il colore del cubo.

Poiché l'aggiornamento dello stato innesca un re-render, dovresti evitare di chiamare useState all'interno di un ciclo o di una condizione.

Vedremo il modo giusto di fare aggiornamenti frequenti con r3f nella lezione sui React Three Fiber hooks e discuteremo degli errori comuni da evitare nella lezione di ottimizzazione.

Per il momento, ecco alcune linee guida con useState:

  • Evita di chiamare useState per valori che cambiano rapidamente.
  • Usalo al livello più profondo possibile. In questo modo, eviterai di ri-renderizzare oggetti che non necessitano di essere ri-renderizzati.

useMemo

useMemo ti permette di memorizzare un valore. Questo significa che il valore verrà calcolato solo quando le sue dipendenze cambiano.

Sostituiamo il nostro material con uno memorizzato:

import { useMemo, useState } from "react";

// ...

const Cube = (props) => {
  // ...
  const material = useMemo(() => <meshStandardMaterial color={color} />, []);

  return (
    <mesh {...props}>
      <boxGeometry />
      {material}
    </mesh>
  );
};

// ...
  • Il primo argomento è una funzione che restituisce il valore da memorizzare. Nel nostro caso, è un componente material.
  • Il secondo argomento è un array di dipendenze. Abbiamo passato un array vuoto, il che significa che il material verrà calcolato solo una volta.
  • Il valore restituito è il valore memorizzato.

Ora, quando clicchiamo sui pulsanti, il colore del cubo non cambia, perché il material non viene ricalcolato.

Per risolvere questo problema, dobbiamo passare color come dipendenza:

const material = useMemo(() => <meshStandardMaterial color={color} />, [color]);

Adesso, quando clicchiamo sui pulsanti, il colore del cubo cambia, perché il material viene ricalcolato quando lo stato color cambia.

Abbiamo fatto questo per mostrarti come funziona useMemo, ma in questo caso, non è necessario memorizzare il material. React Three Fiber esegue già le ottimizzazioni necessarie per noi.

I casi in cui useMemo può essere utile sono:

  • Quando un valore è costoso da calcolare su un componente che esegue il rendering frequentemente.
  • Quando un componente ha molti figli e vuoi evitare di renderizzarli di nuovo.
  • Quando un componente ha molte props e vuoi evitare di renderizzarlo di nuovo.

Non utilizzare useMemo per ottimizzazioni premature quando inizi con React e r3f. Può essere complicato da usare e può portare a bug. Preferisci usarlo quando hai problemi di prestazioni.

useRef

useRef consente di creare un valore mutabile che persiste tra i render.

È comunemente utilizzato per memorizzare un riferimento a un elemento DOM o a un oggetto Three.js, ma puoi usarlo per memorizzare qualsiasi valore.

La cosa positiva di useRef è che non innesca un re-render quando il suo valore cambia. Con r3f, è perfetto per animazioni o qualsiasi valore che cambia frequentemente.

Three.js logoReact logo

React Three Fiber: The Ultimate Guide to 3D Web Development

✨ You have reached the end of the preview ✨

Go to the next level with Three.js and React Three Fiber!

Get full access to this lesson and the complete course when you enroll:

  • 🔓 Full lesson videos with no limits
  • 💻 Access to the final source code
  • 🎓 Course progress tracking & completion
  • 💬 Invite to our private Discord community
Unlock the Full Course – Just $85

One-time payment. Lifetime updates included.