当您这样做时onClick={alert("click")}
,将调用该alert
函数并将返回值 ( undefined
)分配给该onClick
属性。所以,React 看到的是onClick={undefined}
并说:好吧,那不是一个函数,我为什么要添加这样的处理程序?
您要传递给的onClick
是一个函数,而不是undefined
.
因此,您必须这样做:onClick={myFunction}
wheremyFunction
可以() => alert("...")
像您提到的那样,或者您可以使用它bind
来创建类似的功能:
onClick={alert.bind(window, "click")}
bind
将返回一个新函数,该alert
函数将在内部使用"click"
参数调用该函数。
类似的情况是当您执行setTimeout(() => alert("after 1 second"), 1000)
. setTimeout
期待一个功能。如果你这样做setTimeout(alert("..."), 1000)
了alert
,实际上将被调用,但setTimeout
将作为第一个参数接收undefined
(这就是alert
返回的内容)。
相反,如果您有一个返回 function 的函数,那将起作用:
// This will be called first and will return a function
const sayHelloTo = name => {
// This will be the function passed to `setTimeout`
return () => alert(`Hello ${name}`);
};
setTimeout(sayHelloTo("Alice"), 1000);
您可以以相同的方式将它用于onClick
事物:
onClick={sayHelloTo("Alice")}
这是关于后台发生的事情的一个非常小的例子(这只是一个概念证明,我确信它实际发生的事情比这要好得多):
const elm = {
onClick: null,
// The click method can be invoked manually
// using `elm.click()` or is natively invoked by the browser
click () {
if (typeof this.onClick === "function") {
this.onClick();
}
}
};
// If you do:
elm.onClick = alert("click"); // this calls the alert, and returns undefined
elm.onClick === undefined // true
// But when doing:
elm.onClick = () => alert("click");
typeof elm.onClick // "function"
elm.click(); // this will call the alert