Porque eu tenho que chamar bind de um metodo que está numa classe que extends de Component quando a chamo dentro do jsx?
Porque eu tenho que chamar bind de um metodo que está numa classe que extends de Component quando a chamo dentro do jsx?
Oi Alexandre, tudo bem? O bind é usado para definir explicitamente quem será o this dentro do método. O this neste caso, será sua classe? A classe pai ou um outro objeto externo? Se tratando de eventos, quem vai responder ao evento é a própria classe ou outro componente específico?
Lembra que dentro de eventos, o this se refere na maioria dos casos, ao componente que acionou o evento? Mas nem sempre esse é o caso.
Vê que depende muito do cenário? Para a gente dar uma resposta mais específica, você precisa dar um exemplo em código.
Oi Wanderson, td bem. E vc? Seguq o exemplo:
like() {
const fotoAtualizada = {
...this.state.foto,
likeada: !this.state.foto.likeada
}
this.setState({foto: fotoAtualizada});
}
...
render() {
const { foto } = this.state;
return(
<View>
<View style={styles.cabecalho}>
<Image source={{uri: foto.urlPerfil}}
style={styles.fotoDePerfil} />
<Text>{foto.loginUsuario}</Text>
</View>
<Image source={{uri: foto.urlFoto}}
style={styles.foto} />
<View style={styles.rodape}>
<TouchableOpacity onPress={this.like.bind(this)}>
<Image style={styles.botaoDeLike}
source={this.carregaIcone(foto.likeada)}/>
</TouchableOpacity>
</View>
</View>
);
}
...
Fala Alexandre, tudo bem ?
Esse é exatamente um dos casos que o Wanderson observou muito bem. "Lembra que dentro de eventos, o this se refere na maioria dos casos, ao componente que acionou o evento.."
Usamos o bind
para definir o this adequado para o método like
(o this do nosso componente react, onde temos state, props, etc, que usaremos dentro do método). Caso não utilizemos o bind
, nesse caso, o this apontaria para o componente que reage ao evento disparado (alguma instância de TouchableOpacity ou algo mais interno, nesse caso, se não me engano), teríamos então problemas ao fazer referência às informações do nosso componente.
Espero ter ajudado, pessoal. Abraços!