Embora eu adore o ReactJS, posso dizer que às vezes acho que as interações que eram fáceis durante o pré-ReactJS são irritantemente difíceis ou, no mínimo, “indiretas”. Um exemplo é garantir adequadamente que um determinado <input>
seja focalizado quando um botão em um componente diferente é clicado; antigamente, eram três linhas de código, mas com o React pode ser mais.
Vamos dar uma olhada em algumas estratégias para focar adequadamente no <input>
com o ReactJS.
autofocus
O autofocus
é honrado no ReactJS, mas somente quando o atributo <input>
é renderizado novamente com o React:
<input type="text" autofocus="true" />
autofocus
é fácil de usar, mas só funciona quando o <input>
é renderizado inicialmente; como o React, de forma inteligente, só renderiza novamente os elementos que foram alterados, o autofocus
não é confiável em todos os casos.
componentDidUpdate
com ref
Como não podemos nos basear apenas no autofocus
podemos usar o atributo componentDidUpdate
para completar o foco:
class Expressions extends Component { _input: ?HTMLInputElement; // .... componentDidUpdate(prevProps, prevState) { this._input.focus(); } render() { return ( <div className={this.state.focused ? "focused": ""}> <input autofocus="true" ref={c => (this._input = c)} /> </div> ); } } }
componentDidUpdate
é acionado depois que o componente é atualizado, portanto, qualquer alteração no componente pai acionaria esse método e o seu <input>
receberia o foco. Nos meus casos, geralmente altero um className
no elemento pai para sinalizar que o elemento está ativo e, portanto, o componentDidUpdate
será acionado.
Minha perspectiva da interação entre widgets foi formada pelos dias da estrutura dijit UI do Dojo, em que cada widget geralmente tinha uma referência a cada widget filho; com o ReactJS, essa prática está (espero) sendo evitada. ref
s e usar state
o que é lógico, mas ainda há uma parte de mim que anseia por uma referência simples, e é por isso que a segunda estratégia faz sentido para mim.