[javascript] 렌더링시 내 onClick이 호출되는 이유는 무엇입니까? -React.js
내가 만든 구성 요소가 있습니다.
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);
I되면 render
이 페이지는 activatePlaylist
각각라고 playlist
않은 내 map
. 내가 bind
activatePlaylist
좋아 한다면 :
activatePlaylist.bind(this, playlist.playlist_id)
익명 함수를 사용할 수도 있습니다.
onClick={() => this.activatePlaylist(playlist.playlist_id)}
그러면 예상대로 작동합니다. 왜 이런 일이 발생합니까?
답변
함수 에 onClick
대한 참조 를 전달해야합니다. 이렇게 activatePlaylist( .. )
하면 함수를 호출 onClick
하고 반환 된 값으로 전달합니다.activatePlaylist
. 다음 세 가지 옵션 중 하나를 사용할 수 있습니다.
1 . 사용.bind
activatePlaylist.bind(this, playlist.playlist_id)
2 . 화살표 기능 사용
onClick={ () => this.activatePlaylist(playlist.playlist_id) }
3 . 또는 반환 함수activatePlaylist
activatePlaylist(playlistId) {
return function () {
// you code
}
}
답변
이 동작은 React가 클래스 기반 구성 요소의 릴리스를 발표했을 때 문서화되었습니다.
https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html
자동 바인딩
React.createClass에는 모든 메소드를 자동으로 바인딩하는 내장 매직 기능이 있습니다. 다른 클래스에서이 기능에 익숙하지 않은 JavaScript 개발자에게는 약간 혼란 스러울 수 있으며 React에서 다른 클래스로 이동할 때 혼란 스러울 수 있습니다.
따라서 우리는 React의 클래스 모델에이 기능을 내장하지 않기로 결정했습니다. 원하는 경우 생성자에서 메서드를 명시 적으로 미리 바인딩 할 수 있습니다.
답변
이 게시물이 이미 몇 년 전이라는 것을 알고 있지만, https://reactjs.org/tutorial/tutorial.html 에서이 일반적인 실수에 대한 최신 React 튜토리얼 / 문서를 참조하기 위해 (저도 그렇게했습니다) :
노트
타이핑을 줄이고 혼란스러운 동작을 피하기 위해 여기와 아래에서 이벤트 핸들러에 화살표 함수 구문을 사용합니다.
class Square extends React.Component {
render() {
return (
<button className="square" onClick={() => alert('click')}>
{this.props.value}
</button>
);
}
}
onClick = {() => alert ( ‘click’)}을 사용하여 함수를 onClick 소품으로 전달하는 방법을 확인하세요. React는 클릭 후에 만이 함수를 호출합니다. () =>를 잊어 버리고 onClick = {alert ( ‘click’)}을 작성하는 것은 일반적인 실수이며 구성 요소가 다시 렌더링 될 때마다 경고를 발생시킵니다.
답변
방법을 전달하는 방법 this.activatePlaylist(playlist.playlist_id)
은 즉시 메서드를 호출합니다. 메서드의 참조를 onClick
이벤트에 전달해야합니다 . 아래 언급 된 구현 중 하나를 따라 문제를 해결하십시오.
1.
onClick={this.activatePlaylist.bind(this,playlist.playlist_id)}
여기서 bind 속성은 다음 this.activatePlaylist
을 전달 하여 메서드 의 참조를 만드는 데 사용됩니다.this
컨텍스트와 인수playlist.playlist_id
2.
onClick={ (event) => { this.activatePlaylist.(playlist.playlist_id)}}
이렇게하면 사용자 클릭 동작에서만 트리거되는 onClick 이벤트에 함수가 연결됩니다. 이 코드가 예상되면 this.activatePlaylist
메서드가 호출됩니다.