Componentes funcionais
Os componentes funcionais são uma forma moderna e concisa de criar elementos de UI reutilizáveis em aplicações React. São funções JavaScript que retornam JSX para definir a UI de um componente.
Principais características
• Sintaxe: Os componentes de função são definidos utilizando funções JavaScript simples:
function Welcome(props) {
return <h1>Hello, {props.name}</h1>;
}
• Props: Recebem props como argumento, permitindo a passagem de dados dos componentes pais.
• Gestão de estado: com a introdução de hooks, os componentes funcionais podem gerir o estado utilizando o hook useState:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
Vantagens
- Simplicidade: os componentes de função são mais fáceis de ler, escrever e testar em comparação com os componentes de classe.
- Desempenho: podem ter um melhor desempenho, pois evitam a sobrecarga da instanciação da classe.
- Hooks: os componentes de função podem utilizar hooks React, proporcionando uma forma mais flexível de utilizar as funcionalidades do React.
Gestão do estado
Os componentes funcionais em React podem gerir o estado utilizando o hook useState, que permite aos programadores adicionar e atualizar o estado sem escrever componentes de classe.
Hook useState
O hook useState é o método principal para gerir o estado nos componentes da função:
import React, { useState } from 'react';
function Counter() {
const [count, setCount] = useState(0);
return (
<div>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</div>
);
}
Pontos principais sobre o useState:
- Devolve um array com dois elementos: o valor do estado atual e uma função para o atualizar.
- O estado inicial é passado como argumento para useState.
- As atualizações de estado acionam novas renderizações de componentes.
Multiplas variáveis de estado
Os componentes de função podem ter diversas variáveis de estado:
function Message() {
const [message, setMessage] = useState('');
const [list, setList] = useState([]);
// ...
}
Atualização das variáveis de estado
Para atualizar o estado, utilizamos a função setter devolvida por useState:
setCount(count + 1);
Estados complexos
Para objetos ou arrays, utilize o operador spread para atualizar o estado:
const [items, setItems] = useState([]);
const addItem = () => {
setItems([...items, { id: items.length, value: Math.random() * 10 }]);
};
Ciclo de vida
Os componentes funcionais em React não possuem métodos de ciclo de vida como os componentes de classe. Em vez disso, utilizam hooks para gerir os efeitos colaterais e os estados durante todo o ciclo de vida do componente. O principal hook para lidar com a lógica relacionada com o ciclo de vida é o useEffect.
Hook useEffect
O hook useEffect cobre várias fases do ciclo de vida:
- Montagem (Mounting): O efeito é executado após a renderização inicial.
- Atualização (Updating): O efeito é executado após cada renderização se a matriz de dependências for alterada.
- Desmontagem (Unmounting): A função de limpeza é executada quando o componente está prestes a ser desmontado.
O hook useEffect aceita dois parâmetros, sendo o 2º opcional:
useEffect(function, [dependency])
No entanto, podemos querer que o effect seja executado somente uma vez, quando um determinado valor se altera.
Para isso, passamos esse valor num array no 2º parâmetro:
useEffect(() => {
/* Executa quando value se altera */
}, [value]);
Se quisermos que o effect execute somente na 1ª renderização, passamos um array vazio no 2º parâmetro:
useEffect(() => {
/* Executa somente na primeira renderização */
}, []);
O hook useEffect combina os métodos componentDidMount(), componentDidUpdate() e componentWillUnmount() do ciclo de vida dos componentes de classe.
Equivalente ao método componentDidMount()
useEffect(() => {
/* ComponentDidMount code */
}, []);
Basta definir como 2º parâmetro um array de dependências vazio para que o código seja executado uma única vez quando o componente é renderizado.
Equivalente ao método componentDidUpdate()
useEffect(() => {
/* componentDidUpdate code */
}, [var1, var2]);
Basta alterar uma das variáveis dependentes (var ou var 2) para que o código do hook seja executado.
Equivalente ao método componentWillUnmount()
useEffect(() => {
return () => {
/* componentWillUnmount code */
}
}, []);
Basta retornar uma função de dentro do useEffect. Se quisermos que essa função seja chamada uma única vez quando o componente é desmontado, passamos um array vazio no parâmetro das dependências.
