如何在点击事件上设置状态,在一个循环中只设置一次?

How to setState on click event, only once within a loop?

提问人:Ozge Cokyasar 提问时间:5/18/2019 最后编辑:Ozge Cokyasar 更新时间:5/18/2019 访问量:677

问:

我有一个函数,我正在循环浏览标签列表。 我有一个 onClick 事件,我正在调用一个函数。 此函数将状态设置为循环中单击项的 ID 的状态。该函数还控制台 .log 的状态。clicked

它记录了 8 次的状态。我的循环中当前有 4 个项目。clicked

我怎样才能使它能够将状态设置为用户每次单击列表中的某个项目时?clicked

这是我的循环:

 {
  filteredArray.map(link => {
   return (
    <div
     key={link.id}
     role="button"
     style={{paddingBottom: 20}}
     onClick={this.changeView(link.id)}
     onKeyPress={this.changeView(link.id)}
     tabIndex={0}
    >
    <Paragraph size="large">
    <a className='heading__dropdown__link' 
     {link.label}
    </a>
    </Paragraph>
   </div>
  )
 })
}

这是我的功能:changeView

  changeView(id) {
    const { clicked } = this.state
    console.log(clicked)

    return (
      () => this.setState({clicked: id})
    )
  }

JavaScript HTML ReactJS OnClick 前端

评论

0赞 Jonas Wilms 5/18/2019
您不会记录单击按钮的时间,而是记录组件呈现的时间。如果它记录了 8 次,则表示您的组件重新渲染了一次(并被调用了 8 次)。也就是说,我不明白问题出在哪里(除了日志记录没有用)changeView
0赞 Olivier Boissé 5/18/2019
它记录了 8 次,因为您为每个项目调用了 2 次函数,4 个项目 * 2 = 8onClick={this.changeView(link.id)} onKeyPress={this.changeView(link.id)}
0赞 Ozge Cokyasar 5/18/2019
谢谢,我该如何让它在组件渲染时记录下来?我只希望能够设置状态并在每次单击项目时记录它,从而将状态设置为单击项目的 ID。@oliv
0赞 Olivier Boissé 5/18/2019
changeView正在返回一个函数,因此只有在您单击或按下某个键时才会更新状态
0赞 Olivier Boissé 5/18/2019
如果只想在单击某个项目时才这样做,则需要更新为console.logchangeViewchangeView(id) { return () => this.setState(state => {console.log(state.clicked); return {clicked: id};}); }

答:

0赞 Miroslav Glamuzina 5/18/2019 #1

你为每个元素调用函数,像这样设置你的函数:

changeView = id => ev => this.setState({clicked: id});
0赞 Tahir Iqbal 5/18/2019 #2

删除 onPress 并添加箭头功能,如下所示onClick

onClick={()=>this.changeView(link.id)}

希望这会有所帮助