使用参数反应onClick - 传递事件

IMO*_*AMA 53 javascript events dom-events reactjs

没有参数

function clickMe(e){
  //e is the event
}

<button onClick={this.clickMe}></button>
Run Code Online (Sandbox Code Playgroud)

带参数

function clickMe(parameter){
  //how to get the "e" ?
}
<button onClick={() => this.clickMe(someparameter)}></button>
Run Code Online (Sandbox Code Playgroud)

我想得到event.我怎么才能得到它?

Jyo*_*aja 106

试试这个

<button onClick={(e) => {
     this.clickMe(e, someParameter)
}}>Click Me!</button>
Run Code Online (Sandbox Code Playgroud)

并在你的功能

function clickMe(event, someParameter){
     //do with event
}
Run Code Online (Sandbox Code Playgroud)

  • 我只想补充一点,这是不建议使用的语法。来自reactjs文档:_此语法的问题是,每次按钮呈现时都会创建一个不同的回调。在大多数情况下,这很好。但是,如果将此回调作为对较低组件的支持传递,则这些组件可能会进行额外的重新渲染。通常,我们建议在构造函数中进行绑定或使用类字段语法进行绑定,以避免出现此类性能问题。 (3认同)
  • 这给了我一个eslint错误(https://eslint.org/docs/rules/arrow-parens.html)我所做的是将函数参数包装在括号中`onClick = {(e)=> {this.clickMe( e,someparameter)}}` (2认同)

Min*_*Kha 15

使用ES6,您可以像这样更短地进行操作:

const clickMe = (parameter) => (event) => {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

Ans使用它:

<button onClick={clickMe(someParameter)} />
Run Code Online (Sandbox Code Playgroud)

  • 当你的组件被安装时,这个也会被触发,你的代码应该是:`onClick={(e) =&gt; clickMe(someParameter)(e)}` (3认同)
  • 这是否也解决了创建新回调的问题?/sf/ask/2981832171/#comment83943132_42597619 (2认同)

Ale*_*Kim 9

使用 ES6 进行柯里化示例:

const clickHandler = param => event => {
  console.log(param); // your parameter
  console.log(event.type); // event type, e.g.: click, etc.
};
Run Code Online (Sandbox Code Playgroud)

我们的按钮,切换处理程序:

<button onClick={(e) => clickHandler(1)(e)}>Click me!</button>
Run Code Online (Sandbox Code Playgroud)

如果你想在没有事件对象的情况下调用这个函数表达式,那么你可以这样调用它:

clickHandler(1)();

此外,由于 react 使用合成事件(原生事件的包装器),因此有一个事件池,这意味着,如果您想event异步使用您的对象,那么您必须使用event.persist()

const clickHandler = param => event => {
  event.persist();
  console.log(event.target);
  setTimeout(() => console.log(event.target), 1000); // won't be null, otherwise if you haven't used event.persist() it would be null.
};
Run Code Online (Sandbox Code Playgroud)

这是现场示例:https : //codesandbox.io/s/compassionate-joliot-4eblc?fontsize=14&hidenavigation=1&theme=dark


小智 8

解决方案1

function clickMe(parameter, event){
}

<button onClick={(event) => {this.clickMe(someparameter, event)}></button>
Run Code Online (Sandbox Code Playgroud)

解决方案2解决方案1中,使用绑定函数比使用箭头函数更好。请注意,事件参数应该是处理函数中的最后一个参数。

function clickMe(parameter, event){
}

<button onClick={this.clickMe.bind(this, someParameter)}></button>
Run Code Online (Sandbox Code Playgroud)


小智 7

要彻底解决创建新的回调问题,利用data-*HTML5 中的属性是 IMO 的最佳解决方案。因为归根结底,即使你提取一个子组件来传递参数,它仍然会创建新的函数。

例如,

const handleBtnClick = e => {
  const { id } = JSON.parse(e.target.dataset.onclickparam);
  // ...
};

<button onClick={handleBtnClick} data-onclickparam={JSON.stringify({ id: 0 })}>
Run Code Online (Sandbox Code Playgroud)

有关使用属性的信息,请参阅https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributesdata-*