Executando verificação de segurança...
2

React Hooks: Para que serve o useEffect

O useEffect

È um hook do React que permite a execução de efeitos colaterais no seu código, como buscar dados de uma API, mudar a DOM ou configurar uma subscription. Ele é chamado passando duas funções como parâmetros: a primeira é a função que será executada, e a segunda é a dependência, que é um array de variáveis que, quando alteradas, farão com que a função seja chamada novamente.

Exemplo

Para entender melhor o uso do useEffect, vamos dar um exemplo de como ele pode ser utilizado para mudar o título de uma página baseado no estado de uma variável. Veja o código abaixo:

import { useState, useEffect } from 'react';
function Example() {
  const [count, setCount] = useState(0);
  useEffect(() => {
    document.title = `Count: ${count}`;
  }, [count]);
  return (
    <>
      <h1>{count}</h1>
      <button onClick={() => setCount(count + 1)}>Increment</button>
    </>
  );
}

Explicação exemplo 1

Nesse exemplo, estamos usando o useState para criar um estado chamado count, que começa com o valor 0. Depois, estamos usando o useEffect para mudar o título da página toda vez que o count for alterado. Dentro do useEffect, estamos passando uma função que muda o título da página para "Count: ", e como dependência estamos passando o count. Isso significa que toda vez que o count mudar, a função dentro do useEffect será chamada novamente, atualizando o título da página.

É importante notar que, se não houvesse a dependência, a função dentro do useEffect só seria chamada uma vez, quando o componente é renderizado pela primeira vez. Dessa forma, sempre que quisermos que uma função seja chamada sempre que uma determinada variável for alterada, devemos passá-la como dependência do useEffect.

Exemplo

import { useState, useEffect } from 'react';
function Example() {
  const [data, setData] = useState(null);
  useEffect(() => {
    async function fetchData() {
      const response = await fetch('https://minha-api.com/dados');
      const json = await response.json();
      setData(json);
    }
    fetchData();
  }, []);
  return (
    <>
      {data ? (
        <>
          <h1>Dados da API</h1>
          <ul>
            {data.map((item) => (
              <li key={item.id}>{item.name}</li>
            ))}
          </ul>
        </>
      ) : (
        <p>Carregando dados...</p>
      )}
    </>
  );
}

Explicação exemplo 2

Neste exemplo, estamos usando o useState para criar um estado chamado data, que começa como null. Em seguida, estamos usando o useEffect para buscar dados de uma API quando o componente é montado. Dentro do useEffect, estamos chamando uma função assíncrona fetchData que usa o fetch para buscar os dados da API e, em seguida, usa o setData para atualizar o estado com os dados retornados. Como dependência, estamos passando um array vazio, o que significa que essa função só será chamada uma vez, quando o componente é montado.

Dessa forma, quando o componente é renderizado pela primeira vez, a função dentro do useEffect é chamada, buscando os dados da API e atualizando o estado data, e a cada renderização subsequente, se o estado data tiver valor, ele é renderizado na tela, caso contrario é exibido uma mensagem de carregando dados.

Em resumo, o useEffect é um hook muito poderoso do React que permite a execução de efeitos colaterais no seu código, como buscar dados de uma API, mudar a DOM ou configurar uma subscription. Ele é chamado passando duas funções como parâmetros: a primeira é a função que será executada, e a segunda é a dependência, que é um array de variáveis que, quando alteradas, farão com que a função seja chamada.

Sites que recomendo

vou deixar alguns sites que recomendo dar uma olhada para não só entender mas exercitar e dominar o uso do useEffect:

A documentação oficial do React: https://pt-br.reactjs.org/docs/hooks-effect.html
A documentação da API de efeitos do React: https://pt-br.reactjs.org/docs/react-api.html#reconcile-effects
O site "Overreacted" do desenvolvedor do React, Dan Abramov: https://overreacted.io/
O site "React Training": https://reacttraining.com/
O site "Hooks" do React: https://react-hooks.netlify.app/

Além disso, existem muitos tutoriais e cursos online disponíveis que podem ajudá-lo a entender melhor o uso do useEffect e outros hooks do React. É importante praticar e experimentar com o uso do useEffect, para que você possa entender melhor como ele funciona e como pode ser útil em seus projetos.

Carregando publicação patrocinada...
1
1

E quando usar useLayoutEffect? Eu havia entendido que este deve ser usado quando manipulamos o DOM diretamente, por exemplo da forma que apliquei:

    useLayoutEffect(() => {
        document.getElementById("titulo").innerHTML = p.titulo;
    }, []);

É correto? Ou ainda usaria useEffect para esse caso?

ps: esse document.getElementById foi criado para evitar fazer um context só pra obter esse titulo da página.

2

O seu entendimento está correto. useLayoutEffect é uma variação do useEffect que é executada síncronamente após todas as atualizações do DOM. É útil quando você precisa manipular o DOM diretamente, por exemplo, quando você precisa medir a largura ou altura de um elemento ou definir o foco em um elemento.

No seu exemplo, você está manipulando o DOM diretamente, atualizando o conteúdo do elemento com o id "titulo". Portanto, é correto usar o useLayoutEffect para garantir que a atualização do DOM seja síncrona e ocorra imediatamente após a atualização de estado.

No entanto, se a manipulação do DOM não precisa ser síncrona, você pode usar useEffect em vez de useLayoutEffect. Isso garante que a manipulação do DOM ocorra de forma assíncrona, após todas as atualizações de estado terem sido processadas. Isso pode ser mais eficiente em termos de desempenho, pois não bloqueará a thread principal do navegador durante a atualização do DOM.

Em resumo, você está usando o hook correto no seu exemplo. Use useLayoutEffect sempre que precisar manipular o DOM diretamente de forma síncrona e useEffect quando a manipulação do DOM puder ser assíncrona.

1

Em outras palavras, reatividade ? Gosto bastante de VueJS porque achei menos verboso e um pouco mais fácil de entender

<script setup>
import { reactive } from 'vue'

const state = reactive({ count: 0 })

function increment() {
  state.count++
}
</script>

<template>
  <button @click="increment">
    {{ state.count }}
  </button>
</template>
1
1
1
1
1

Sim comecei meus estudos em React mas acabei indo para Vue.js, também concordo com menos verbosidade, também gosto por ter html javascript e css separado mas ao mesmo tempo no mesmo arquivo e acho mais facil para aprender e transportar tudo que aprende para outros frameworks e linguagens, React e como se tivesse linguagem propria sabe.

1

No final é tudo Javascript. Se você dominar javascript, você não tem problema nenhum em "transportar" para outras frameworks (Angular/Vue/React). Obviamente você vai precisar aprender como a ferramenta funciona, os hooks e etc, mas em tese, é tudo quase a mesma coisa.