javascript - 如何在react中重新绑定(bind)点击事件

标签 javascript reactjs

在 react 中动态更改事件绑定(bind)的推荐/最干净的方法是什么?

例如,如果我最初有一个这样的按钮

<button type="button" onClick={this.handleFirstClick}>

然后在handleFirstClick方法中

handleFirstClick() {
    //do other stuff
    //rebind the button, so that next time it's clicked, handleSecondClick() would be called
}

如果我的意思不太清楚,这就是我想做的,使用 jQuery 而不是 React

$('#myButton').on('click', handleFirstClick);

function handleFirstClick() {
    //other stuff
    $('#myButton').off('click');
    $('#myButton').on('click', handleSecondClick);
}

最佳答案

解决方案 1:React State 和 Ternary Expressions

为了更改事件的绑定(bind),您需要在渲染方法中使用 if-else。为组件创建一些状态来处理按钮是否已被单击。第一次单击后,设置状态,以便将来运行第二个函数。您可以包括基本的 ternary expression检查 render() 中的状态。

class FancyButton extends React.Component {
  constructor() {
    super()
    this.state = {
      clicked: false
    }

    //Bindings for use in render()
    this.onFirstClick = this.onFirstClick.bind(this)
    this.onSecondClick = this.onSecondClick.bind(this)
  }

  onFirstClick() {
    console.log("First click")
    this.setState({
      clicked: true
    })
  }

  onSecondClick() {
    console.log("Another click")
  }

  render() {
    return ( <
      button onClick = {
        this.state.clicked ? this.onSecondClick : this.onFirstClick
      } > Click < /button>
    )
  }
}

ReactDOM.render( < FancyButton / > , document.getElementById("root"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

解决方案 2:在对象属性中保留状态

从更一般的意义上来说,您可能不需要更改渲染方法中的事件处理程序。如果您只调用一个 onClick 处理程序并切换对象属性,则可以在每次单击后跳过重新渲染 React 组件(因为跳过对 this.setState 的调用)。

class FancyButton extends React.Component {
  constructor() {
    super()
    this.clicked = false

    //Bindings for use in render()
    this.onClick = this.onClick.bind(this)
  }

  onClick() {
    if (!this.clicked) {
      this.onFirstClick()
    } else {
      this.onSecondClick()
    }
    this.clicked = true
  }

  onFirstClick() {
    console.log("First click")
  }

  onSecondClick() {
    console.log("Another click")
  }

  render() {
    return ( <
      button onClick = {
        this.onClick
      } > Click < /button>
    )
  }
}

ReactDOM.render( < FancyButton / > , document.getElementById("root"))
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/react/15.1.0/react-dom.min.js"></script>
<div id="root"></div>

我个人推荐第二种解决方案,因为它更有效,但您可以自行决定哪种最适合您的情况。

关于javascript - 如何在react中重新绑定(bind)点击事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44292078/

相关文章:

javascript - Angular 中的异步电子邮件验证

reactjs - 该电子邮件已存在验证

reactjs - 将配置添加到 package.json 有什么好处?

reactjs - 使用react-router设置初始路由

javascript - Angular 。如何不重复相同的功能

javascript - 我的所有浏览器都没有发送原始 header

需要 JavaScript 帮助(YQL 和 JavaScript)

javascript - 如何在 JavaScript 中计算数组的总和

reactjs - 异步函数意外标记,预期 (

node.js - Remix.run 不使用 node.js 作为后端吗?