У меня есть компонент, который я создал:
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);
Когда я render
открываю эту страницу, activatePlaylist
вызывается для каждого playlist
в моем map
. Если мне bind
activatePlaylist
нравится:
activatePlaylist.bind(this, playlist.playlist_id)
Я также могу использовать анонимную функцию:
onClick={() => this.activatePlaylist(playlist.playlist_id)}
тогда он работает как положено. Почему так происходит?
javascript
reactjs
redux
джхамм
источник
источник
React
таким образом. Я неправильно запомнил илиapi
изменилось?.bind
, как вы говорите в шаге 1, необходимо ли делать шаг 2? а если да, то почему? Потому что я думаю, что когда вы используете стрелочную функцию, контекст - это тот, в котором функция была определена, но если мы.bind
подключаем контекст, используя , контекст уже прикреплен, верно?Такое поведение было задокументировано, когда React объявил о выпуске компонентов на основе классов.
https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html
источник
Я знаю, что этому посту уже несколько лет, но просто чтобы сослаться на последний учебник / документацию по React об этой распространенной ошибке (я тоже ее сделал) из https://reactjs.org/tutorial/tutorial.html :
class Square extends React.Component { render() { return ( <button className="square" onClick={() => alert('click')}> {this.props.value} </button> ); } }
источник
То, как вы передаете метод
1.this.activatePlaylist(playlist.playlist_id)
, вызовет метод немедленно. Вы должны передать вonClick
событие ссылку на метод . Следуйте одной из описанных ниже реализаций, чтобы решить вашу проблему.onClick={this.activatePlaylist.bind(this,playlist.playlist_id)}
Здесь свойство bind используется для создания ссылки на
2.this.activatePlaylist
метод путем передачиthis
контекста и аргументаplaylist.playlist_id
onClick={ (event) => { this.activatePlaylist.(playlist.playlist_id)}}
Это добавит функцию к событию onClick, которое будет запускаться только при нажатии пользователем. Когда этот код выполнится,
this.activatePlaylist
будет вызван метод.источник