Bez parametru
function clickMe(e){
//e is the event
}
<button onClick={this.clickMe}></button>
Z parametrem
function clickMe(parameter){
//how to get the "e" ?
}
<button onClick={() => this.clickMe(someparameter)}></button>
Chcę dostać event
. Jak mogę to dostać?
javascript
reactjs
events
dom-events
IMOBAMA
źródło
źródło
onClick={(e) => { this.clickMe(e, someparameter) }}
data-*
atrybutów w HTML5. Zobacz moją odpowiedź poniżej, aby uzyskać więcej informacji.Dzięki ES6 możesz to zrobić w krótszy sposób:
const clickMe = (parameter) => (event) => { // Do something }
I użyj go:
źródło
onClick={(e) => clickMe(someParameter)(e)}
const clickMe = (parameter) => (event) => {...}
zamiast tegoconst clickMe = (parameter) => {...}
?Rozwiązanie 1
function clickMe(parameter, event){ } <button onClick={(event) => {this.clickMe(someparameter, event)}></button>
Rozwiązanie 2 Użycie funkcji bind jest uważane za lepsze niż sposób funkcji strzałkowej w rozwiązaniu 1. Należy zauważyć, że parametr zdarzenia powinien być ostatnim parametrem w funkcji obsługi
function clickMe(parameter, event){ } <button onClick={this.clickMe.bind(this, someParameter)}></button>
źródło
Aby całkowicie rozwiązać problem tworzenia nowego wywołania zwrotnego, użyj
data-*
atrybutów w HTML5 jest najlepszym rozwiązaniem IMO. Ponieważ w końcu, nawet jeśli wyodrębnisz komponent podrzędny, aby przekazać parametry, nadal tworzy on nowe funkcje.Na przykład,
const handleBtnClick = e => { const { id } = JSON.parse(e.target.dataset.onclickparam); // ... }; <button onClick={handleBtnClick} data-onclickparam={JSON.stringify({ id: 0 })}>
Zobacz https://developer.mozilla.org/en-US/docs/Learn/HTML/Howto/Use_data_attributes, aby dowiedzieć się, jak używać
data-*
atrybutów.źródło
Przykład curry z ES6:
const clickHandler = param => event => { console.log(param); // your parameter console.log(event.type); // event type, e.g.: click, etc. };
Nasz przycisk, który przełącza obsługę:
<button onClick={(e) => clickHandler(1)(e)}>Click me!</button>
Jeśli chcesz wywołać to wyrażenie funkcyjne bez obiektu zdarzenia, nazwałbyś to w ten sposób:
clickHandler(1)();
Ponadto, ponieważ reakcja wykorzystuje zdarzenia syntetyczne (opakowanie dla zdarzeń natywnych), istnieje pula zdarzeń , co oznacza, że jeśli chcesz używać swojego
event
obiektu asynchronicznie, musisz użyć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. };
Oto przykład na żywo: https://codesandbox.io/s/compassionate-joliot-4eblc?fontsize=14&hidenavigation=1&theme=dark
źródło
event.persist()
z,console.log(event)
ale nie potrzebuję tego zconsole.log(event.target)
?let event;
sposób nie spowoduje to nieokreślonego błędu.