为什么我的onClick被调用渲染? - React.js

jha*_*amm 81 javascript reactjs redux

我有一个我创建的组件:

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);
Run Code Online (Sandbox Code Playgroud)

当我render这个页面时,我的activatePlaylist每一个都被称为.如果我喜欢:playlistmapbind activatePlaylist

activatePlaylist.bind(this, playlist.playlist_id)
Run Code Online (Sandbox Code Playgroud)

我也可以使用匿名函数:

onClick={() => this.activatePlaylist(playlist.playlist_id)}
Run Code Online (Sandbox Code Playgroud)

然后它按预期工作.为什么会这样?

Ale*_* T. 161

你需要传递给函数的onClick 引用,当你这样做时,activatePlaylist( .. )你调用函数并传递给onClick返回的值activatePlaylist.您可以使用以下三个选项之一:

1.运用.bind

activatePlaylist.bind(this, playlist.playlist_id)
Run Code Online (Sandbox Code Playgroud)

2.使用箭头功能

onClick={ () => this.activatePlaylist(playlist.playlist_id) }
Run Code Online (Sandbox Code Playgroud)

3.或返回功能activatePlaylist

activatePlaylist(playlistId) {
  return function () {
     // you code 
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @Rafa Romero这只是三个不同的选项,您可以使用其中一个 (2认同)
  • React Docs官方网站上现在有一个部分全面解答了这个问题:https://reactjs.org/docs/faq-functions.html (2认同)

CAM*_*344 6

我知道这篇文章已经有几年了,但只是为了从https://reactjs.org/tutorial/tutorial.html引用关于这个常见错误的最新 React 教程/文档(我也犯了):

笔记

为了节省输入并避免这种令人困惑的行为,我们将在此处和下面的事件处理程序中使用箭头函数语法:

class Square extends React.Component {
 render() {
   return (
     <button className="square" onClick={() => alert('click')}>
       {this.props.value}
     </button>
   );
 }
}
Run Code Online (Sandbox Code Playgroud)

注意 onClick={() => alert('click')} 是如何传递一个函数作为 onClick 属性的。React 只会在点击后调用这个函数。忘记 () => 并编写 onClick={alert('click')} 是一个常见的错误,每次组件重新渲染时都会触发警报。