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
incrementarContador
foi definido por meio de um arrow function, pois isso garante que othis
referenciará a classeContador
e 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
this
nesse cenário é necessário pelo fato da função declarada comfunction
ser tratado como um objeto pelo JavaScript. Dessa forma, othis
faz 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>
);
}
}