没有参数
function clickMe(e){
//e is the event
}
<button onClick={this.clickMe}></button>
带参数
function clickMe(parameter){
//how to get the "e" ?
}
<button onClick={() => this.clickMe(someparameter)}></button>
我想得到event
。我怎么才能得到它?
Answers:
尝试这个:
<button onClick={(e) => {
this.clickMe(e, someParameter)
}}>Click Me!</button>
并在您的职能:
function clickMe(event, someParameter){
//do with event
}
data-*
HTML5中的属性。请参阅以下我的答案以获取更多详细信息。
使用ES6,您可以像这样更短地进行操作:
const clickMe = (parameter) => (event) => {
// Do something
}
并使用它:
<button onClick={clickMe(someParameter)} />
onClick={(e) => clickMe(someParameter)(e)}
const clickMe = (parameter) => (event) => {...}
替代品const clickMe = (parameter) => {...}
呢?
解决方案1
function clickMe(parameter, event){
}
<button onClick={(event) => {this.clickMe(someparameter, event)}></button>
解决方案2 在解决方案1中,使用绑定函数比使用箭头函数更好。请注意,事件参数应该是处理函数中的最后一个参数。
function clickMe(parameter, event){
}
<button onClick={this.clickMe.bind(this, someParameter)}></button>
要完全解决创建新的回调问题,利用data-*
HTML5中的属性是IMO的最佳解决方案。从一天开始,即使您提取了一个子组件来传递参数,它仍然会创建新功能。
例如,
const handleBtnClick = e => {
const { id } = JSON.parse(e.target.dataset.onclickparam);
// ...
};
<button onClick={handleBtnClick} data-onclickparam={JSON.stringify({ id: 0 })}>
有关使用属性的信息,请参见https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributesdata-*
。
柯里用ES6例如:
const clickHandler = param => event => {
console.log(param); // your parameter
console.log(event.type); // event type, e.g.: click, etc.
};
我们的按钮,切换处理程序:
<button onClick={(e) => clickHandler(1)(e)}>Click me!</button>
如果要在没有事件对象的情况下调用此函数表达式,则可以通过以下方式调用它:
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.
};
这是一个实时示例:https : //codesandbox.io/s/compassionate-joliot-4eblc?fontsize=14&hidenavigation=1&theme=dark
event.persist()
与之console.log(event)
共存,但我却不需要console.log(event.target)
?
let event;
这样,它不会引发未定义的错误。
onClick={(e) => { this.clickMe(e, someparameter) }}