"O que são Effects no React e como o Hook `useEffect` funciona?"
No React, um efeito é qualquer coisa que acontece fora do processo de renderização do componente. Ou seja, qualquer coisa que o React não gerencie diretamente como parte da renderização da UI.
Exemplos comuns incluem buscar dados, atualizar o título da aba do navegador, ler ou gravar no armazenamento local do navegador, obter a localização do usuário e muito mais. Essas operações interagem com o mundo externo e são conhecidas como efeitos colaterais.
React fornece o hook
useEffect para permitir que você lide com esses efeitos colaterais. useEffect permite que você execute uma função após o componente renderizar ou atualizar.
Vamos ver como o hook useEffect funciona e por que ele é essencial para o desenvolvimento moderno em React.
Para usar o hook useEffect, você primeiro precisa importá-lo:
import { useEffect } from "react";
Então você o usa como uma função, assim:
useEffect(() => {
// Your side effect logic (usually a function) here
}, [dependencies]);
A função de efeito é executada após o componente renderizar, enquanto o argumento opcional dependencies controla quando o efeito é executado.
Observe que dependencies pode ser um array de "valores reativos" (state, props, functions, variables e assim por diante), um array vazio ou ser omitido completamente. Aqui está como todas essas opções controlam como useEffect funciona:
- Se
dependenciesfor um array que inclui um ou mais valores reativos, o efeito será executado sempre que eles mudarem. - Se
dependenciesfor um array vazio,useEffectexecuta apenas uma vez quando o componente é renderizado pela primeira vez. - Se você omitir
dependencies, o efeito será executado toda vez que o componente renderizar ou atualizar.
Counter, não passamos um argumento dependencies, então o efeito é executado quando o componente renderiza e toda vez que ele atualiza:
import { useState, useEffect } from "react";
const Counter = () => {
const [count, setCount] = useState(0);
useEffect(() => {
console.log("Component renders");
});
return (
<div
style={{
display: "flex",
alignItems: "center",
flexDirection: "column",
}}
>
<h2>{count}</h2>
<div>
<button onClick={() => setCount(count + 1)}>Increase</button>
<button onClick={() => setCount(count - 1)}>Decrease</button>
</div>
</div>
);
};
export default Counter;
Mas se passarmos um array vazio como dependência, o efeito será executado apenas na primeira renderização:
useEffect(() => {
console.log('Component renders');
}, []);
Se você passar o estado count como uma dependência, o efeito será executado quando o componente for renderizado pela primeira vez e quando count mudar:
useEffect(() => {
document.title = The current count is ${count};
console.log('component renders');
}, [count]);
Observe que, se o efeito que você configurou persistir além do ciclo de vida de renderização do componente, pode ser necessário outra função para "limpar" essa função após o componente renderizar ou atualizar.
Por exemplo, se sua função de efeito usa setInterval(), configura um listener de evento como window.addEventListener(), ou conecta a um servidor, você precisará de uma função de limpeza para executar clearInterval(), window.removeEventListener() e desconectar do servidor, respectivamente.
Aqui está a sintaxe para retornar uma função de limpeza do hook useEffect:
useEffect(() => {
// Your side effect logic here
return () => {
// Cleanup logic here (optional)
};
}, [dependencies]);
Por exemplo, se você adicionar um listener de evento de scroll, pode limpá-lo removendo-o na sua função de limpeza:
useEffect(() => {
const handleScroll = () => {
// Handle scroll logic
};
window.addEventListener("scroll", handleScroll);
return () => {
window.removeEventListener("scroll", handleScroll);
};
}, []);Este módulo não possui perguntas. Marque como concluído.