Artigo original: How to update a component’s prop in ReactJS — oh yes, it’s possible

Escrito por: Dheeraj DeeKay

Se você leu a documentação oficial do React (e você deveria, já que é um recurso incrível disponibilizado pela equipe do React), você deve ter notado essas linhas:

Independente se você declarar um componente como uma função ou uma classe, ele nunca deve modificar suas próprias props.
React é bastante flexível mas tem uma única regra estrita:
Todos os componentes React tem que agir como funções puras em relação às suas props.

Props nunca devem ser atualizadas. Nós devemos usá-las como são recebidas. Parece rígido, certo? O React, porém, tem seus motivos para ter essa regra e eu estou bastante convencido pelo raciocínio por trás disso. A única exceção entretanto, é que existem situações em que podemos precisar iniciar a atualização de uma prop. Em breve, saberemos como fazer isso.

Considere a seguinte linha de código de um componente pai:

<MyChild childName={this.state.parentName} />

Essa é uma linha simples com a qual toda pessoa desenvolvedora em React está familiarizada. Você está chamando seu componente filho. Enquanto faz isso, você também está passando o estado do componente pai (parentName) para o filho. No componente filho, esse estado será acessado como this.props.childName. É isso.

Agora, se houver a necessidade de qualquer alteração de nome, parentName será alterado no componente pai e essa alteração automaticamente será comunicada ao filho, como é comum no comportamento do React. Essa configuração vai funcionar na maior parte dos cenários.

Entretanto, o que ocorre se você precisar atualizar a prop de um componente filho, mas a informação da alteração necessária e o disparador para realizá-la só é conhecido por esse componente filho? Considerando os caminhos do React, os dados apenas podem transitar de cima para baixo, do pai para o filho. Assim, como podemos comunicar ao componente pai que a prop precisa ser alterada?

Bem, embora isso seja contrário ao padrão e não recomendado, as pessoas que desenvolveram a linguagem pensaram nisso. Surpresa!

Podemos fazer isso usando callbacks. Eu sei, sem surpresas até aqui! Elas parecem ser úteis para todos os problemas que tivemos até agora. Está certo, mas como?

Imagine se a chamada do componente filho acima fosse modificada da seguinte maneira:

<MyChild childName={this.state.parentName} onNameChange={this.onChange}/>

Agora, além de uma prop childName, nosso componente filho também possui um evento exposto chamado onNameChange. Essa é a forma de resolver o problema. Nosso componente filho fez sua parte. Agora, o componente pai deve fazer o que for necessário. Isso não é motivo de preocupação. Tudo que ele precisa fazer é definir uma função onChange, da seguinte forma:

function onChange(newName) {this.setState({parentName:newName });}

É isso. Agora, sempre que quisermos atualizar a prop parentName no componente filho, tudo que precisamos fazer é chamar this.props.onNameChange('My new name') e pronto! Você terá o que deseja. Tudo resolvido. Espero que tenha sido fácil de entender.

Uma última coisa.

O React argumenta contra esse método e eles estão certos sobre isso, afinal, vai contra o padrão. Então, sempre que você encontrar uma situação como essa, verifique se é possível subir seu state ou se há uma maneira de dividir seu componente em partes. Isso pode parecer um pouco tedioso, mas saiba que é o modo ideal de se utilizar o React!

Boa programação para você!