Sobes.tech
Middle

Fale sobre as diferenças entre componentes controlados e não controlados no React.

sobes.tech IA

Resposta da IA

Os componentes controlados gerem o seu estado através de useState (ou this.state em classes) e recebem dados e funções de callback através de props. O estado do formulário, por exemplo, é armazenado no estado do React e atualizado através de manipuladores onChange.

Os componentes não controlados armazenam o seu estado dentro do DOM. Para aceder ao seu valor, usa-se useRef (ou React.createRef em classes) para obter uma referência ao elemento DOM. O valor dos elementos do formulário, por exemplo, é extraído diretamente do DOM ao submeter.

Característica Componente controlado Componente não controlado
Gestão do estado Estado do React (useState) DOM
Acesso ao valor Através do estado e props Através de Refs (useRef)
Atualização Reativa, a cada alteração Apenas numa ação explícita (por exemplo, submit)
Validação Na lógica do React Através da API HTML padrão ou manualmente após obter o valor

Exemplo de componente controlado:

import React, { useState } from 'react';

function ControlledInput() {
  const [value, setValue] = useState('');

  const handleChange = (event) => {
    setValue(event.target.value);
  }

  return (
    <input type="text" value={value} onChange={handleChange} />
  );
}

Exemplo de componente não controlado:

import React, { useRef } from 'react';

function UncontrolledInput() {
  const inputRef = useRef(null);

  const handleClick = () => {
    alert('Valor do input: ' + inputRef.current.value);
  }

  return (
    <> 
      <input type="text" ref={inputRef} />
      <button onClick={handleClick}>Obter valor</button>
    </>
  );
}

A escolha entre eles depende da complexidade da lógica e da necessidade de reação instantânea às mudanças de entrada. Os componentes controlados são preferíveis para formulários complexos e validação em tempo real. Os não controlados são adequados para formulários simples ou para integração com bibliotecas DOM de terceiros.