렌더링 시 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);
내가 할 때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://reactjs.org/tutorial/tutorial.html:
메모
입력을 저장하고 혼란을 피하기 위해 아래 이벤트핸들러에 화살표 함수 구문을 사용합니다.
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')} 라고 쓰는 것은 일반적인 실수이며 컴포넌트가 다시 켜질 때마다 경고가 발생합니다.
이 동작은 React가 클래스 기반 컴포넌트의 릴리스를 발표했을 때 입증되었습니다.
https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html
자동 바인딩
React.createClass에는 모든 메서드를 자동으로 바인드하는 매직 기능이 내장되어 있습니다.이는 다른 클래스에서 이 기능에 익숙하지 않은 JavaScript 개발자들에게는 조금 혼란스러울 수 있으며 React에서 다른 클래스로 이동할 때 혼란스러울 수 있습니다.
그래서 우리는 이것을 React 클래스 모델에 짜넣지 않기로 했습니다.원하는 경우 생성자에서 메서드를 명시적으로 프리바인드할 수 있습니다.
import React from 'react';
import { Page ,Navbar, Popup} from 'framework7-react';
class AssignmentDashboard extends React.Component {
constructor(props) {
super(props);
this.state = {
}
onSelectList=(ProjectId)=>{
return(
console.log(ProjectId,"projectid")
)
}
render() {
return (
<li key={index} onClick={()=> this.onSelectList(item.ProjectId)}></li>
)}
당신이 그 방법을 통과시키는 방법this.activatePlaylist(playlist.playlist_id)
는 즉시 메서드를 호출합니다.이 메서드의 참조를onClick
이벤트. 아래 중 하나의 구현에 따라 문제를 해결하십시오.
onClick={this.activatePlaylist.bind(this,playlist.playlist_id)}
여기서 바인드 속성은 의 참조를 작성하기 위해 사용됩니다.this.activatePlaylist
패스 방식this
문맥과 논거playlist.playlist_id
onClick={ (event) => { this.activatePlaylist.(playlist.playlist_id)}}
그러면 onClick 이벤트에 함수가 연결되며 사용자 클릭 작업 시에만 트리거됩니다.이 코드가 외부로 전송될 때this.activatePlaylist
메서드가 호출됩니다.
언급URL : https://stackoverflow.com/questions/34226076/why-is-my-onclick-being-called-on-render-react-js
'programing' 카테고리의 다른 글
JSON.stringify() 출력 중 특정 값 숨기기 (0) | 2023.04.01 |
---|---|
메뉴 구분 막대로 작성하는데 첫 번째 항목과 마지막 항목에 막대가 없는 방법? (0) | 2023.04.01 |
Python을 사용하여 RESTful 서비스에서 JSON 데이터를 얻는 방법은 무엇입니까? (0) | 2023.04.01 |
MongoDB 기본 사용자 및 비밀번호는 무엇입니까? (0) | 2023.04.01 |
Spring Boot 요청: "디버깅을 활성화하여 응용 프로그램을 재실행합니다" - 어떻게 해야 합니까? (0) | 2023.04.01 |