Componente Stateful
Os componentes stateful são responsáveis por gerenciar e manter um estado interno. Eles são definidos como classes que estendem a classe React.Component. Esses componentes têm a capacidade de reagir a eventos, atualizar seu próprio estado e, por consequência, acionar a renderização da interface.
Atenção
Nas versões anteriores a 16.8 do React, a única forma de criar componentes Stateful era por meio de componentes de classe, porém atualmente, após a adição dos React Hooks esta abordagem por classes entrou em desuso.
Características dos componentes Stateful:
- Mantêm um estado interno: Possuem um estado interno acessível através do método
setState. - Classes do ES6: São geralmente implementados como classes do ES6.
Toda vez que o estado de um componente mudar, via setState(), o método render() é chamado para renderizá-lo novamente, porém com o novo estado.
import React, { Component } from 'react';
class Contador extends Component {
constructor(props) {
super(props);
this.state = { contador: 0 };
}
incrementarContador = () => {
this.setState({ contador: this.state.contador + 1 });
};
render() {
return (
<div>
<p>Contagem: {this.state.contador}</p>
<button onClick={this.incrementarContador}>Incrementar</button>
</div>
);
}
}Nota
Vale ressaltar que o método
incrementarContadorfoi definido por meio de um arrow function, pois isso garante que othisreferenciará a classeContadore assim não é necessário realizar obind, por exemploconstructor(props) { super(props); this.incrementarContador = this.incrementarContador.bind(this); // ... } incrementarContador() { this.setState({ contador: this.state.contador + 1 }); }O bind do
thisnesse cenário é necessário pelo fato da função declarada comfunctionser tratado como um objeto pelo JavaScript. Dessa forma, othisfaz referência a esta primeira instância (função) e não a classeContador(segunda instância).
Para reduzir ainda mais a verbosidade dos componentes de classe, é possível utilizar Class Fields do JavaScript e assim remover o uso do método construtor.
import React, { Component } from 'react';
class Contador extends Component {
state = { contador: 0 };
incrementarContador = () => {
this.setState({ contador: this.state.contador + 1 });
};
render() {
return (
<div>
<p>Contagem: {this.state.contador}</p>
<button onClick={this.incrementarContador}>Incrementar</button>
</div>
);
}
}