當你做onClick={alert("click")}
這將調用alert
函數並將返回值(undefined
)分配給onClick
屬性。所以,React看到的是onClick={undefined}
並說:好吧,那不是一個函數,爲什麼我會添加這樣一個處理程序?
想要傳遞給onClick
的是函數,而不是undefined
。
因此,你必須做的:onClick={myFunction}
其中myFunction
可以() => alert("...")
正如你所說,或者您可以使用bind
創建類似的功能:
onClick={alert.bind(window, "click")}
bind
將回一個新功能這將使用"click"
參數在內部調用alert
函數。
類似的情況是當你做setTimeout(() => alert("after 1 second"), 1000)
。 setTimeout
需要一個功能。如果你做setTimeout(alert("..."), 1000)
,確實會調用alert
,但setTimeout
將接收第一個參數undefined
(這就是alert
返回的結果)。
相反,如果你有返回功能,功能,將工作:
// 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
'alert('click')'是一個函數調用。 React會讀取它並立即執行它。您應該將引用傳遞給命名函數。所以,'this.myFunction'而不是'this.myFunction()'。或者,您可以引用一個匿名函數,這就是您在原始文章中輸入的內容。 – glhrmv