Javascript 带参数的onClick匿名函数vs onClick(函数(参数))
我想知道为什么在某些类型的事件中,例如Javascript 带参数的onClick匿名函数vs onClick(函数(参数)),javascript,reactjs,Javascript,Reactjs,我想知道为什么在某些类型的事件中,例如onClick,如果我的函数包含参数,我必须声明一个匿名函数来执行onClick 示例: 导出默认函数App(){ const myValue=“我的价值”; const handleClick=(anyString)=>{ log(anyString); }; const anotherClick=()=>{ console.log(“它工作”); }; 返回( 另一个单击()}color=“primary”> 在没有参数的情况下工作您应该在onClick
onClick
,如果我的函数包含参数,我必须声明一个匿名函数来执行onClick
示例:
导出默认函数App(){
const myValue=“我的价值”;
const handleClick=(anyString)=>{
log(anyString);
};
const anotherClick=()=>{
console.log(“它工作”);
};
返回(
另一个单击()}color=“primary”>
在没有参数的情况下工作您应该在onClick={func}
中指定一个函数,“func”只引用一个变量
当说onClick={func()}
时,您是在添加func()
的返回值,而不是在发出事件时指定要执行的function func(){}
单击按钮时,将执行onClick={}
中指定的函数。
这就是你正在做的:
let emit = function () { };
button.addEventListener('click', emit());
单击按钮时,它会尝试将undefined
作为函数调用,因为函数emit()已返回undefined
onClick
接受回调,即单击按钮时将调用的函数
另一个click
是一个函数,因此它可以正常工作,因为它被正确调用
()=>另一个click()
与此等效
。。。
常量myTempFunction=()=>{
再次单击();
}
...
onClick={myTempFunction}
因为您最终要将函数传递给onClick
,所以它可以工作
()=>handleClick(myValue)
与上述原因相同,等效代码为
。。。
常量myTempFunction=()=>{
handleClick(myValue);
}
...
onClick={myTempFunction}
handleClick(myValue)
,现在您实际调用的是函数,您传递的是函数返回给onClick
的值,而不是函数本身,
等效代码是
。。。
const myResult=handleClick(myValue);//这是调用函数的结果
...
onClick={myResult}//myResult不是函数,它是handleClick(myValue)的返回值
由于您实际上没有将函数传递给onClick
,onClick
无法调用,并且在()的文档中它不起作用,因此有一个示例
function ActionLink() {
function handleClick(e) {
e.preventDefault();
console.log('The link was clicked.');
}
return (
<a href="#" onClick={handleClick}>
Click me
</a>
);
}
这是由于语法扩展的设计,我们称之为JSX模板扩展。当涉及到JSX内部的事件处理时,它需要对回调函数进行引用,该函数将在特定事件发生后触发
这是在JSX通过Babel转换成JavaScript之前
return (
<div>
<Button onClick={anotherClick} color="secondary">
Works without arguments
</Button>
<Button onClick={handleClick(myValue)} color="secondary">
Does NOT work with arguments
</Button>
</div>
);
这里可以清楚地看到,second click处理程序直接执行函数,而不是将回调函数传递给React.createElement
。因为内部React元素需要回调函数来传递给此函数,而您只是尝试执行该函数,而不是解析引用。,因为重新执行该函数并将其返回的内容分配给单击处理程序。您没有看到它立即被调用吗?onClick={handleClick(myString)}
立即调用该函数(在渲染期间),并尝试将返回值分配给onClick
;而onClick={()=>handleClick(myString)
传递一个函数引用,该函数引用将在单击时被调用。另外一个重要注意事项-onClick={anotherClick}
与onClick={anotherClick()}
(与上述注释的原因相同)。以下括号表示应该调用函数,这是一个非常重要的区别。
return (
<div>
<Button onClick={anotherClick} color="secondary">
Works without arguments
</Button>
<Button onClick={handleClick(myValue)} color="secondary">
Does NOT work with arguments
</Button>
</div>
);
return React.createElement("div", null, React.createElement(Button, {
onClick: anotherClick,
color: "secondary"
}, "Works without arguments"),
React.createElement(Button, {
onClick: handleClick(myValue),
color: "secondary"
}, "Does NOT work with arguments"));