Componentes de classe

Os componentes de classe no React são classes ES6 que estendem React.Component e fornecem uma forma de criar elementos de UI reutilizáveis ​​com características mais avançadas. Eram a principal forma de criar componentes antes da introdução de hooks.

Principais características

  • Sintaxe: os componentes da classe são definidos utilizando a sintaxe da classe ES6.
  • Gestão de estado: os componentes da classe podem gerir o seu próprio estado utilizando this.state e this.setState().
  • Métodos do ciclo de vida: têm acesso a métodos de ciclo de vida como componentDidMount, componentDidUpdate e componentWillUnmount.

Exemplo de um componente de classe

class Carro extends React.Component {
  render() {
    return <h1>Marca, {this.props.marca}</h1>;
  }
}

Prós e contras

Prós

  • Mais recursos como métodos de ciclo de vida e gestão de estado.
  • Familiar para programadores com experiência em POO.

Contras

  • Sintaxe mais complexa em comparação com os componentes funcionais.
  • Requer a compreensão da palavra-chave ‘this’.
  • Menos desempenho do que os componentes de função em alguns casos.

Ciclo de vida

Os componentes da classe passam por três fases principais do ciclo de vida:

  • Montagem: Quando o componente está a ser adicionado ao DOM.
  • Atualização: quando o estado ou as propriedades do componente são alterados.
  • Desmontar: Quando o componente está a ser removido do DOM

Métodos do ciclo de vida

Os componentes de React passam por diversas fases durante o seu ciclo de vida.

NOTA: o ciclo de vida de um componente começa quando ele é criado e termina quando é colocado no DOM ou é apagado.

As fases no ciclo de vida de um componente são: Mounting, Updating e Unmounting.

Cada uma destas fases possui vários métodos de callback especiais que são chamados pelo React:

construtor(): inicializa o estado e liga os métodos.

render(): O único método necessário, retorna JSX para ser renderizado.

componentDidMount(): É executado após a montagem do componente, ideal para a pesquisa de dados.

componentDidUpdate(): é executado após a ocorrência de atualizações, útil para efeitos colaterais.

componentWillUnmount(): É executado antes do componente ser desmontado, utilizado para limpeza.

Mounting phase

Esta é a fase em que uma instância de um componente é criada é inserida no DOM.

Nesta fase existem 3 métodos de callback que são os seguintes: constructor(), render() e componentDidMount().

Estes 3 métodos são chamados pelo React por esta ordem e podemos usá-los para executar determinadas tarefas no respetivo timing.

Se o método constructor() estiver declarado este será o primeiro a ser chamado pelo React.

Este método é chamado aquando da inicialização do componente e é o sitio ideal para definir o estado inicial do componente assim como inicializar outros dados.

O método constructor() é chamado com os props, como argumentos, e deve sempre começar por chamar super (props) antes de qualquer outra coisa; isso iniciará o método construtor do componente pai e permitirá que o componente herde métodos docomponente pai (React.Component).

class Header extends React.Component { 
   constructor(props) { 
      super(props); 
      this.state = {favoritecolor: "red"}; 
   } 
   render() { 
      return ( 
         <h1>My Favorite Color is {this.state.favoritecolor}</h1> 
      ); 
   } 
} 

O método render() é obrigatório e é o método, a partir do qual, o HTML do componente é gerado.

class Header extends React.Component { 
  render() { 
    return ( 
      <h1>This is the content of the Header component</h1> 
    ); 
  } 
} 
 
ReactDOM.render(<Header />, document.getElementById('root')); 

O método componentDidMount() é chamado após o componente ter sido colocado no DOM. É o sitio ideal para actualizar ao dados do componente através de pedidos de AJAX a uma base de dados no servidor.

class Header extends React.Component { 
  constructor(props) { 
    super(props); 
    this.state = {favoritecolor: "red"}; 
  } 
  componentDidMount() { 
    //Faz pedido de AJAX aqui para obter dados do servidor 
  } 
  render() { 
    return ( 
      <h1>My Favorite Color is {this.state.favoritecolor}</h1> 
    ); 
  } 
} 
 
ReactDOM.render(<Header />, document.getElementById('root')); 

Updating phase

A próxima fase do ciclo de vida de um componente é actualizado. É a Updating fase.

Um componente é actualizado sempre que o state ou props mudam.

Esta fase possui vários métodos de callback mas vamos só considerar os dois seguintes, por serem os mais frequentemente usados: render() e componentDidUpdate(). Estes dois métodos são chamados por esta ordem.

O método render() é chamado quando um componente é atualizado; ele deve renderizar novamente o HTML no DOM, com as novas alterações.

class Header extends React.Component { 
  constructor(props) { 
    super(props); 
    this.state = {favoritecolor: "red"}; 
  } 
  componentDidMount() { 
    setTimeout(() => { 
      this.setState({favoritecolor: "yellow"}) 
    }, 1000) 
  } 
  componentDidUpdate() { 
    document.getElementById("mydiv").innerHTML = 
    "The updated favorite is " + this.state.favoritecolor; 
  } 
  render() { 
    return ( 
      <div> 
      <h1>My Favorite Color is {this.state.favoritecolor}</h1> 
      <div id="mydiv"></div> 
      </div> 
    ); 
  } 
} 
 
ReactDOM.render(<Header />, document.getElementById('root')); 

Unmounting phase

A ultima fase, Unmounting fase, ocorre quando um componente é removido do DOM.

Esta fase só possui um método de callback: componentWillUnmount().

class Container extends React.Component { 
  constructor(props) { 
    super(props); 
    this.state = {show: true}; 
  } 
  delHeader = () => { 
    this.setState({show: false}); 
  } 
  render() { 
    let myheader; 
    if (this.state.show) { 
      myheader = <Child />; 
    }; 
    return ( 
      <div> 
      {myheader} 
      <button type="button" onClick={this.delHeader}>Delete Header</butto
 n> 
      </div> 
    ); 
  } 
} 
 
class Child extends React.Component { 
  componentWillUnmount() { 
    alert("The component named Header is about to be unmounted."); 
  } 
  render() { 
    return ( 
      <h1>Hello World!</h1> 
    ); 
  } 
} 

ReactDOM.render(<Container />, document.getElementById('root')); 

Props

Props nos componentes da classe React são uma forma de passar dados de componentes pais para componentes filhos. São acedidos usando o objeto this.props dentro da classe.

Aceder aos props

Num componente de classe, os props estão disponíveis através de this.props:

class Pessoa extends React.Component {
  render() {
    return <h1>Olá, {this.props.nome}</h1>;
  }
}