React - Ciclo de vida e context API

Imagem para React - Ciclo de vida e context API

ReactPostado em  3 min de leitura

Na versão 16.3.0, que foi lançada em 29 de março de 2018, teve a adição de novos métodos para o ciclo de vida dos componentes e nova API.

Métodos de ciclo de vida

No ciclo de vida dos componentes existem métodos para controlarmos o fluxo de montar, atualizar e desmontar cada elemento. E com essa versão do React, três métodos estão sendo depreciados: componentWillMount, componentWillReceiveProps, e componentWillUpdate. E foram adicionados dois novos métodos:

  • getDerivedStateFromProps – adicionado como uma alternativa mais segura do método componentWillReceiveProps. Executado tanto na inicialização do componente quanto na sua atualização de propriedades e deve retornar as alterações no estado do componente baseada nas propriedades ou nulo.
  • getSnapshotBeforeUpdate – adicionado para oferecer suporte à leitura segura de propriedades. Todo valor retornado por esse método é enviado ao componentDidUpdate que é o ciclo executado posteriormente.

Context API

Sempre existiu uma Context API, mas era instável e com diversos problemas relacionados à performance. Eu particularmente já usava para uma questão de tema e gostei muito da estabilide que veio nessa versão.

Ao compartilhar informações entre componentes totalmente desconexos você terá que utilizar a arquitetura flux com Redux. Com a nova Context API conseguimos facilmente repassar informações de qualquer tipo entre diversos componentes do React.

Precisaremos ver 3 coisas: React.createContext, Provider e Consumer.

Abaixo, temos o componente filho Title e ainda não estamos usando a nova API de contexto.

class App extends Component {
  state = {
    ttile: 'Esse é um título'
  }

  render() {
    const { title } = this.state;
    return (
      {tenant &&
        <div className="container">
          <Title />
        </div>
      }
    );
  }
}

Vamos começar criando uma variável de contexto com o comando React.createContext passando como parâmetro o valor padrão quando nenhum valor existir nessa variável.

const ExampleContext = React.createContext('example');

A variável ExampleContext já pode ser considerada uma variável de contexto. Para alterar o seu valor, precisamos utilizar um componente chamado Provider que pertence à essa variável:

render() {
  const { title } = this.state;
  return (
    <ExampleContext.Provider value={title}>
      {title &&
        <div className="container">
          <Title />
        </div>
      }
    </ExampleContext.Provider>
  );
}

Assim, criamos um ExampleContext.Provider com uma única propriedade chamada value que é responsável por prover o valor da variável de contexto.

Agora o componente Title, consome o ExampleContext:

function Title() {
  return (
    <ExampleContext.Consumer>
      {title => (
        <h1>{title}</h1>
      )}
    </ExampleContext.Consumer>
  );
}

Com o ThemeContext.Consumer podemos utilizar esses dados e trabalhar com uma técnica chamada render props.

Sendo assim, você não vai mais precisar utilizar o Redux sempre que precisar compartilhar informações entre componentes, mas vale lembrar que a arquitetura Flux é muito mais do que simplesmente compartilhamento de dados, tem a ver com estrutura, com fluxo de informações e arquitetura dos dados da aplicação.

Para retornar o valor padrão que informamos na criação da variável ExampleContext, o componente não deverá possuir um Provedor correspondente acima dele na árvore. Isso pode ser útil para testar componentes isoladamente sem envolvê-los.

render() {
  const { title } = this.state;
  return (
    <div className="container">
      <Title />
    </div>
  );
}

// Saída: example

Mais pode ser visto na documentação oficial.

Considerações finais

Então vamos continuar precisando de um gerenciamento de estado mais complexo como o Redux e temos a API de contexto quando for necessário compartilhar algumas informações entre componentes.

Agora é ficar ligado nos novos métodos e prestar atenção nos que foram depreciados. A biblioteca está evoluindo muito bem e vamos botar a mão na massa.