Tenho um componente que criei:
class Create extends Component {
constructor(props) {
super(props);
}
render() {
var playlistDOM = this.renderPlaylists(this.props.playlists);
return (
<div>
{playlistDOM}
</div>
)
}
activatePlaylist(playlistId) {
debugger;
}
renderPlaylists(playlists) {
return playlists.map(playlist => {
return <div key={playlist.playlist_id} onClick={this.activatePlaylist(playlist.playlist_id)}>{playlist.playlist_name}</div>
});
}
}
function mapStateToProps(state) {
return {
playlists: state.playlists
}
}
export default connect(mapStateToProps)(Create);
Quando eu render
esta página, activatePlaylist
é chamado para cada um playlist
no meu map
. Se eu bind
activatePlaylist
gosto:
activatePlaylist.bind(this, playlist.playlist_id)
Também posso usar uma função anônima:
onClick={() => this.activatePlaylist(playlist.playlist_id)}
então ele funciona conforme o esperado. Por que isso acontece?
javascript
reactjs
redux
Jhamm
fonte
fonte
React
dessa forma. Estou me lembrando errado ouapi
mudou?.bind
, como você disse na etapa 1, é necessário executar a etapa 2? e se for, por quê? Porque eu acho que quando você usa a função seta, o contexto é aquele que é onde a função foi definida, mas se a gente estiver anexando o contexto usando.bind
, o contexto já está anexado, certo?Este comportamento foi documentado quando o React anunciou o lançamento de componentes baseados em classes.
https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html
fonte
Eu sei que esta postagem já tem alguns anos, mas apenas para consultar o tutorial / documentação mais recente do React sobre esse erro comum (eu também cometi) em https://reactjs.org/tutorial/tutorial.html :
fonte
A maneira como você passa o método
1this.activatePlaylist(playlist.playlist_id)
chama o método imediatamente. Você deve passar a referência do método para oonClick
evento. Siga uma das implementações mencionadas abaixo para resolver seu problema.Aqui, a propriedade bind é usada para criar uma referência do
2this.activatePlaylist
método passando othis
contexto e o argumentoplaylist.playlist_id
Isso anexará uma função ao evento onClick, que será acionado apenas na ação de clique do usuário. Quando este código for executado, o
this.activatePlaylist
método será chamado.fonte