[英]Why is my onClick being called on render? - 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
这个页面时,我的map
每个playlist
都会调用activatePlaylist
。 如果我bind
activatePlaylist
如下:
activatePlaylist.bind(this, playlist.playlist_id)
我还可以使用匿名函数:
onClick={() => this.activatePlaylist(playlist.playlist_id)}
然后它按预期工作。 为什么会发生这种情况?
您需要传递对函数的onClick
引用,当您这样做时activatePlaylist( .. )
调用函数并传递给从activatePlaylist
返回的onClick
值。 您可以使用以下三个选项之一:
1 . 使用.bind
activatePlaylist.bind(this, playlist.playlist_id)
2 . 使用箭头函数
onClick={ () => this.activatePlaylist(playlist.playlist_id) }
3 . 或从activatePlaylist
返回函数
activatePlaylist(playlistId) {
return function () {
// you code
}
}
我知道这篇文章已经有几年了,但只是为了从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')} 是一个常见的错误,每次组件重新渲染时都会触发警报。
当 React 宣布发布基于类的组件时,记录了这种行为。
https://facebook.github.io/react/blog/2015/01/27/react-v0.13.0-beta-1.html
自动绑定
React.createClass 有一个内置的魔法特性,可以自动为你绑定所有方法。 对于不习惯其他类中的此功能的 JavaScript 开发人员来说,这可能会有点混乱,或者当他们从 React 转移到其他类时可能会感到困惑。
因此我们决定不将这个内置到 React 的类模型中。 如果需要,您仍然可以在构造函数中显式地预绑定方法。
您传递方法this.activatePlaylist(playlist.playlist_id)
的方式将立即调用该方法。 您应该将方法的引用传递给onClick
事件。 按照下面提到的实现之一来解决您的问题。
onClick={ (event) => { this.activatePlaylist.(playlist.playlist_id)}}
这里的 bind 属性用于通过传递this
上下文和参数playlist.playlist_id
来创建this.activatePlaylist
方法的引用
onClick={ (event) => { this.activatePlaylist.(playlist.playlist_id)}}
这会将一个函数附加到 onClick 事件,该函数将仅在用户单击操作时触发。 当此代码执行时,将调用this.activatePlaylist
方法。
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>
)}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.