React hooks

Starter pack

Vamos ver com o React Three Fiber quais React hooks usaremos comumente e como usá-los evitando armadilhas comuns.

Se você não está familiarizado com hooks do React, recomendo que leia primeiro a documentação oficial.

useState

useState permite criar uma variável de estado e uma função para atualizá-la.

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

Ele retorna um array com dois elementos:

  • a variável de estado
  • a função para atualizá-la.

Você pode usá-lo assim:

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

// ...

Toda vez que você clica em um dos botões, a cor do cubo muda.

Como atualizar o estado aciona um re-render, você deve evitar chamar useState dentro de um loop ou uma condição.

Veremos a maneira correta de fazer atualizações frequentes com r3f na lição de React Three Fiber hooks e discutiremos os erros comuns a evitar na lição de otimização.

Por enquanto, aqui estão algumas regras gerais para useState:

  • Evite chamar useState para valores que mudam rapidamente.
  • Use-o no nível mais profundo possível. Dessa forma, você evitará re-renderizar itens que não precisam ser re-renderizados.

useMemo

useMemo permite memoizar um valor. Isso significa que o valor será computado apenas quando suas dependências tiverem mudado.

Vamos substituir nosso material por um material memoizado:

import { useMemo, useState } from "react";

// ...

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

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

// ...
  • O primeiro argumento é uma função que retorna o valor a ser memoizado. No nosso caso, é um componente de material.
  • O segundo argumento é um array de dependências. Passamos um array vazio, o que significa que o material será computado apenas uma vez.
  • O valor retornado é o valor memoizado.

Agora, quando clicamos nos botões, a cor do cubo não muda, porque o material não é re-computado.

Para resolver isso, precisamos passar a color como uma dependência:

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

Agora, quando clicamos nos botões, a cor do cubo muda, porque o material é re-computado quando o estado de color muda.

Fizemos isso para mostrar como useMemo funciona, mas neste caso, não é necessário memoizar o material. React Three Fiber já faz as otimizações necessárias para nós.

Casos onde useMemo pode ser benéfico são:

  • Quando um valor é custoso de computar em um componente que renderiza frequentemente.
  • Quando um componente tem muitos filhos e você quer evitar re-renderizá-los.
  • Quando um componente tem muitas props e você quer evitar re-renderizá-lo.

Não use useMemo para otimização prematura quando começar com React e r3f. Pode ser complicado de usar e levar a bugs. Prefira usá-lo quando tiver problemas de performance.

useRef

useRef permite criar um valor mutável que persiste através das renderizações.

É comumente usado para armazenar uma referência a um elemento DOM ou a um objeto Three.js, mas você pode usá-lo para armazenar qualquer valor.

A grande vantagem do useRef é que ele não dispara uma re-renderização quando seu valor muda. Com r3f, isso é perfeito para animações ou qualquer valor que muda frequentemente.

End of lesson preview

To get access to the entire lesson, you need to purchase the course.