Wenn Sie das tun onClick={alert("click")}
, die die alert
Funktion und weisen Sie den Rückgabewert (undefined
) an die onClick
Eigenschaft nennen los ist. Also, was React sieht ist onClick={undefined}
und sagt: Nun, das ist keine Funktion, warum würde ich solch einen Handler hinzufügen?
Was Sie an onClick
weitergeben möchten, ist eine Funktion, nicht undefined
.
Deshalb müssen Sie tun: onClick={myFunction}
wo myFunction
() => alert("...")
sein können, wie Sie erwähnt haben, oder Sie können bind
verwenden eine ähnliche Funktion zu erstellen:
onClick={alert.bind(window, "click")}
bind
wird Rückkehr eine neue Funktion die wird intern die alert
Funktion mit dem "click"
Argument aufrufen.
Ein ähnlicher Fall ist, wenn Sie setTimeout(() => alert("after 1 second"), 1000)
tun. setTimeout
erwartet eine Funktion. Wenn Sie setTimeout(alert("..."), 1000)
tun, wird die alert
in der Tat aufgerufen werden, aber die setTimeout
wird als erstes Argument undefined
erhalten (das ist, was alert
zurückgibt).
Stattdessen, wenn Sie eine Funktion haben, die gibt eine Funktion, wird dies funktionieren:
// 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);
Sie es auf die gleiche Art und Weise für das onClick
Dingen verwenden:
onClick={sayHelloTo("Alice")}
Dies ist ein sehr kleines Beispiel, was passiert im Hintergrund (es ist nur ein Beweis für das Konzept, ich bin mir sicher, was es tatsächlich passiert ist viel besser th ein this):
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')' ist ein Funktionsaufruf. React liest es und führt es sofort aus. Sie sollten stattdessen einen Verweis auf eine benannte Funktion übergeben. Also, 'this.myFunction' anstelle von' this.myFunction() '. Alternativ können Sie auf eine anonyme Funktion verweisen, die Sie in Ihren ursprünglichen Beitrag einfügen. – glhrmv