Fundamentals
Core
Master
Shaders
React hooks
Veamos con React Three Fiber qu茅 React hooks usaremos com煤nmente y c贸mo usarlos evitando errores comunes.
Si no est谩s familiarizado con los hooks de React, te recomiendo leer primero la documentaci贸n oficial.
useState
useState te permite crear una variable de estado y una funci贸n para actualizarla.
const [color, setColor] = useState("white");
Devuelve un array con dos elementos:
- la variable de estado
- la funci贸n para actualizarla.
Puedes usarlo as铆:
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> ); }; // ...
Cada vez que haces clic en uno de los botones, el color del cubo cambia.
Debido a que actualizar el estado desencadena una re-renderizaci贸n, debes evitar llamar a useState
dentro de un bucle o una condici贸n.
Veremos la forma correcta de hacer actualizaciones frecuentes con r3f en la lecci贸n de React Three Fiber hooks, y discutiremos los errores comunes a evitar en la lecci贸n de optimizaci贸n.
Por el momento, aqu铆 hay algunas reglas generales con useState
:
- Evita llamar a
useState
para valores que cambian r谩pidamente. - 脷salo en el nivel m谩s profundo posible. De esa manera, evitar谩s re-renderizar elementos que no necesitan ser re-renderizados.
useMemo
useMemo te permite memoizar un valor. Esto significa que el valor se calcular谩 solo cuando sus dependencias hayan cambiado.
Reemplacemos nuestro material por uno memoizado:
import { useMemo, useState } from "react"; // ... const Cube = (props) => { // ... const material = useMemo(() => <meshStandardMaterial color={color} />, []); return ( <mesh {...props}> <boxGeometry /> {material} </mesh> ); }; // ...
- El primer argumento es una funci贸n que devuelve el valor a memoizar. En nuestro caso, es un componente de material.
- El segundo argumento es un array de dependencias. Pasamos un array vac铆o, lo que significa que el material se calcular谩 solo una vez.
- El valor devuelto es el valor memoizado.
Ahora, cuando hacemos clic en los botones, el color del cubo no cambia, porque el material no se vuelve a calcular.
Para solucionar esto, necesitamos pasar el color
como una dependencia:
const material = useMemo(() => <meshStandardMaterial color={color} />, [color]);
Ahora, cuando hacemos clic en los botones, el color del cubo cambia, porque el material se vuelve a calcular cuando el estado color
cambia.
Hicimos esto para mostrarte c贸mo funciona useMemo
, pero en este caso, no es necesario memoizar el material. React Three Fiber ya hace las optimizaciones necesarias por nosotros.
Casos donde
useMemo
puede ser beneficioso son:
- Cuando un valor es costoso de calcular en un componente que se renderiza con frecuencia.
- Cuando un componente tiene muchos hijos y quieres evitar renderizarlos de nuevo.
- Cuando un componente tiene muchas props y quieres evitar renderizarlo de nuevo.
No uses
useMemo
para la optimizaci贸n prematura cuando empieces con React y r3f. Puede ser complicado de usar y puede llevar a errores. Prefiere usarlo cuando tengas problemas de rendimiento.
useRef
useRef te permite crear un valor mutable que persiste a lo largo de los renders.
Se usa com煤nmente para almacenar una referencia a un elemento DOM o un objeto de Three.js pero se puede usar para almacenar cualquier valor.
Lo bueno de useRef
es que no desencadena un re-render cuando su valor cambia. Con r3f, esto es perfecto para animaciones o cualquier valor que cambie frecuentemente.
End of lesson preview
To get access to the entire lesson, you need to purchase the course.