No universo do React, entender a diferença entre `props` e `state` é crucial para construir componentes reutilizáveis e dinâmicos. Muitos desenvolvedores, inclusive os mais experientes, se confundem com esses conceitos. Mas fica tranquila! Neste guia, vamos desmistificar tudo, com exemplos práticos e dicas que você não encontra em outro lugar.
O Que São Props?
Definição e Características


Props (abreviação de propriedades) são dados que um componente pai passa para um componente filho. Pense nelas como argumentos de uma função. Uma característica fundamental é que as props são imutáveis dentro do componente filho. Isso significa que o componente filho não pode modificar os valores que recebe. Essa imutabilidade é essencial para garantir um fluxo de dados previsível e facilitar a manutenção do código. As props permitem a reutilização de componentes com diferentes valores, tornando seu código mais modular e eficiente.
Como Passar Props em React

A sintaxe para passar props é bem simples. Por exemplo: <Componente nome="Valor" />. Você pode passar diferentes tipos de dados, como strings, números, booleanos, arrays, objetos e até funções. Para passar múltiplos props de um objeto, você pode usar o operador spread (...). Veja um exemplo prático:
const dados = { nome: "Maria", idade: 30 };
<Componente {...dados} />Props Padrão (defaultProps)

Para evitar erros e garantir que seu componente sempre tenha valores definidos, você pode usar defaultProps. Isso define valores padrão para as props caso o componente pai não as passe. Por exemplo:
Componente.defaultProps = { nome: "Anônimo", idade: 18 };Validação de Props com PropTypes

Validar os tipos de props é crucial para evitar erros inesperados e garantir a integridade dos dados. A biblioteca prop-types, desenvolvida pela equipe do Facebook, permite definir os tipos esperados de cada prop. Imagine a seguinte situação:
import PropTypes from 'prop-types';
Componente.propTypes = {
nome: PropTypes.string.isRequired,
idade: PropTypes.number
};Neste exemplo, estamos dizendo que a prop nome deve ser uma string e é obrigatória (isRequired), enquanto a prop idade deve ser um número e é opcional.
Exemplo Prático de Props

Vamos criar um componente simples que exibe informações básicas (nome, idade) recebidas via props:
function Info(props) {
return (
<div>
<h2>Nome: {props.nome}</h2>
<p>Idade: {props.idade}</p>
</div>
);
}
export default Info;O Que é State?
Definição e Características
State são dados gerenciados internamente por um componente. Ao contrário das props, o state é mutável dentro do componente. Isso permite que os componentes reajam a interações do usuário e atualizem a interface de forma dinâmica. O state é o que torna seus componentes interativos e responsivos.
Inicialização do State

Em componentes de classe, você inicializa o state no construtor. Em componentes funcionais, você usa o useState hook. Veja como:
// Componente de classe
class Contador extends React.Component {
constructor(props) {
super(props);
this.state = { contador: 0 };
}
}
// Componente funcional
import React, { useState } from 'react';
function Contador() {
const [contador, setContador] = useState(0);
}Atualizando o State
É crucial usar setState (em componentes de classe) ou a função retornada por useState para atualizar o state. A diferença crucial é que o React usa essas funções para rastrear as mudanças e re-renderizar o componente de forma eficiente. Nunca modifique o state diretamente. Veja um exemplo:
// Componente de classe
this.setState({ contador: this.state.contador + 1 });
// Componente funcional
setContador(contador + 1);State em Componentes de Classe vs. Componentes Funcionais
A principal diferença é a sintaxe. Em componentes de classe, você usa this.state e this.setState. Em componentes funcionais, você usa o useState hook, que retorna um valor e uma função para atualizar esse valor. Componentes funcionais com hooks tendem a ser mais concisos e fáceis de ler, mas a escolha depende do seu estilo de programação e das necessidades do projeto.
Exemplo Prático de State
Vamos criar um componente que controla um contador usando o state:
import React, { useState } from 'react';
function Contador() {
const [contador, setContador] = useState(0);
return (
<div>
<p>Contador: {contador}</p>
<button onClick={() => setContador(contador + 1)}>Incrementar</button>
</div>
);
}
export default Contador;Props vs. State: As Diferenças Cruciais
Imutabilidade vs. Mutabilidade
A principal diferença é que as props são imutáveis, enquanto o state é mutável. Isso significa que você não pode modificar as props dentro de um componente filho, mas pode modificar o state dentro do próprio componente. Essa diferença impacta diretamente o fluxo de dados e a arquitetura da sua aplicação. Imagine a seguinte tabela:
| Característica | Props | State |
|---|---|---|
| Mutabilidade | Imutável | Mutável |
| Fluxo de Dados | Pai para filho | Interno ao componente |
| Gerenciamento | Externo | Interno |
Fluxo de Dados
As props seguem um fluxo unidirecional, do componente pai para o componente filho. O state, por outro lado, é gerenciado internamente pelo componente. Isso significa que um componente não pode modificar o state de outro componente diretamente. Se você precisa compartilhar o state entre componentes irmãos, você precisa elevar o state para um componente pai comum.
Propriedade vs. Gerenciamento
As props são propriedades passadas para o componente, enquanto o state é gerenciado pelo próprio componente. Pense nas props como informações que você recebe de fora, e no state como informações que você controla internamente.
Quando Usar Props e Quando Usar State
Use props para passar dados de um componente pai para um componente filho. Use state para gerenciar dados internos que precisam ser alterados ao longo do tempo. Componentes controlados e não controlados são um exemplo prático dessa decisão.
Boas Práticas e Dicas
Componentes Controlados vs. Não Controlados
Componentes controlados são aqueles em que o valor dos elementos de formulário (como inputs) é controlado pelo state do React. Componentes não controlados, por outro lado, usam o DOM para armazenar seus valores. Componentes controlados oferecem maior flexibilidade e controle, mas exigem mais código. Componentes não controlados são mais simples, mas menos flexíveis.
Lifting State Up
Lifting state up é a técnica de elevar o state para um componente pai comum, para que ele possa ser compartilhado entre componentes irmãos. Isso é útil quando você precisa que componentes irmãos reajam às mesmas mudanças de state. Imagine dois componentes, um campo de busca e uma lista de resultados. Se você quer que a lista de resultados seja filtrada com base no que o usuário digita no campo de busca, você precisa elevar o state do campo de busca para um componente pai comum.
Gerenciamento de State Global com Context API ou Redux
Para aplicações maiores, gerenciar o state com useState pode se tornar complicado. Nesses casos, você pode considerar o uso do Context API ou do Redux. O Context API é uma solução nativa do React para compartilhar state entre componentes sem precisar passar props manualmente em cada nível da árvore de componentes. O Redux é uma biblioteca de gerenciamento de state mais robusta, que oferece um fluxo de dados unidirecional e previsível, facilitando a depuração e a manutenção do código.
Desmistificando Erros Comuns
Erro: Modificar Props Diretamente
Tentar modificar props diretamente é um erro comum. Como as props são imutáveis, você não pode fazer algo como props.nome = "Novo Nome". Isso não vai funcionar e pode causar comportamentos inesperados. Para evitar esse erro, sempre trate as props como dados somente leitura.
Erro: Não Atualizar o State Corretamente
Não usar setState ou a função de atualização do useState corretamente é outro erro comum. Se você tentar modificar o state diretamente, como this.state.contador = this.state.contador + 1, o React não vai detectar a mudança e não vai re-renderizar o componente. Para garantir que o state seja atualizado corretamente, sempre use setState ou a função de atualização do useState.
Erro: Confundir Props com State
Confundir props com state é um erro que pode acontecer, especialmente no início. Lembre-se que as props são passadas de um componente pai para um componente filho, enquanto o state é gerenciado internamente pelo componente. Se você está tendo problemas para decidir se deve usar props ou state, pense se o dado precisa ser alterado ao longo do tempo. Se sim, use state. Se não, use props.
Dúvidas Frequentes
Qual a diferença fundamental entre props e state?
Props são para passar dados de pai para filho (imutáveis), enquanto state é para gerenciar dados internos do componente (mutáveis).
Posso usar state em componentes de classe e funcional?
Sim, mas a sintaxe muda. Em classes, use `this.state` e `this.setState`. Em funcionais, use o hook `useState`.
Quando devo usar Context API ou Redux?
Use Context API ou Redux quando precisar gerenciar o estado globalmente em componentes que estão muito distantes.
É errado modificar props diretamente?
Sim, é errado! Props são imutáveis e devem ser tratadas como dados somente leitura. Modificá-las pode causar comportamentos inesperados.
Como compartilhar o state entre dois componentes irmãos?
Use a técnica de “lifting state up”, elevando o state para um componente pai comum que pode passá-lo para os filhos via props.
Para não esquecer:
Props são como presentes que um componente pai dá a um filho, enquanto state é como um diário que um componente guarda para si. Use cada um no lugar certo e seus componentes React serão muito mais fáceis de entender e manter!
E aí, tudo certo com Props e State? Espero que este guia tenha te ajudado a clarear as ideias. Deixe seu comentário e compartilhe este artigo com seus amigos!




