Mam komponent, który stworzyłem:
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);
Kiedy ja render
ta strona, activatePlaylist
jest wezwana dla każdego playlist
w moim map
. Jeśli mi się bind
activatePlaylist
podoba:
activatePlaylist.bind(this, playlist.playlist_id)
Mogę też skorzystać z anonimowej funkcji:
onClick={() => this.activatePlaylist(playlist.playlist_id)}
wtedy działa zgodnie z oczekiwaniami. Dlaczego to się dzieje?
javascript
reactjs
redux
jhamm
źródło
źródło
React
ten sposób. Czy źle pamiętam, czy to sięapi
zmieniło?.bind
, jak powiedziałeś w kroku 1, konieczne jest wykonanie kroku 2? a jeśli tak, dlaczego? Ponieważ myślę, że kiedy używasz funkcji strzałkowej, kontekstem jest ten, w którym funkcja została zdefiniowana, ale jeśli dołączamy kontekst za pomocą.bind
, kontekst jest już dołączony, prawda?To zachowanie zostało udokumentowane, gdy React ogłosił wydanie komponentów opartych na klasach.
https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html
źródło
Wiem, że ten post ma już kilka lat, ale tylko w celu odniesienia się do najnowszego samouczka / dokumentacji Reacta na temat tego częstego błędu (ja też to zrobiłem) z https://reactjs.org/tutorial/tutorial.html :
class Square extends React.Component { render() { return ( <button className="square" onClick={() => alert('click')}> {this.props.value} </button> ); } }
źródło
Sposób, w jaki przekazujesz metodę
1.this.activatePlaylist(playlist.playlist_id)
, spowoduje natychmiastowe wywołanie metody. Powinieneś przekazać odwołanie do metody doonClick
zdarzenia. Postępuj zgodnie z jedną z poniższych implementacji, aby rozwiązać problem.onClick={this.activatePlaylist.bind(this,playlist.playlist_id)}
Tutaj właściwość bind jest używana do tworzenia odwołania do
2.this.activatePlaylist
metody przez przekazaniethis
kontekstu i argumentuplaylist.playlist_id
onClick={ (event) => { this.activatePlaylist.(playlist.playlist_id)}}
Spowoduje to dołączenie funkcji do zdarzenia onClick, które zostanie wywołane tylko po kliknięciu przez użytkownika. Po wykonaniu tego kodu
this.activatePlaylist
metoda zostanie wywołana.źródło