Chcę przeczytać właściwości wartości zdarzenia onClick. Ale kiedy klikam, widzę coś takiego na konsoli:
SyntheticMouseEvent {dispatchConfig: Object, dispatchMarker: ".1.1.0.2.0.0:1", nativeEvent: MouseEvent, type: "click", target
Mój kod działa poprawnie. Kiedy uruchamiam, widzę, {column}
ale nie mogę dostać tego w zdarzeniu onClick.
Mój kod:
var HeaderRows = React.createClass({
handleSort: function(value) {
console.log(value);
},
render: function () {
var that = this;
return(
<tr>
{this.props.defaultColumns.map(function (column) {
return (
<th value={column} onClick={that.handleSort} >{column}</th>
);
})}
{this.props.externalColumns.map(function (column) {
// Multi dimension array - 0 is column name
var externalColumnName = column[0];
return ( <th>{externalColumnName}</th>);
})}
</tr>
);
}
});
Jak mogę przekazać wartość do onClick
zdarzenia w React js?
javascript
reactjs
użytkownik1924375
źródło
źródło
Odpowiedzi:
Łatwy sposób
Użyj funkcji strzałki:
Spowoduje to utworzenie nowej funkcji, która będzie wywoływać
handleSort
z odpowiednimi parametrami.Lepszy sposób
Wyodrębnij go do podskładnika. Problem z użyciem funkcji strzałki w wywołaniu renderowania polega na tym, że za każdym razem tworzy ona nową funkcję, co powoduje niepotrzebne ponowne renderowanie.
Jeśli utworzysz podskładnik, możesz przekazać moduł obsługi i użyć rekwizytów jako argumentów, co spowoduje ponowne renderowanie tylko po zmianie rekwizytów (ponieważ odwołanie do modułu obsługi nigdy się nie zmienia):
Podskładnik
Główny składnik
Old Easy Way (ES5)
Użyj,
.bind
aby przekazać żądany parametr:źródło
<a>
tagiem, w którym musisz przekazać zdarzenie, aby użyćpreventDefault()
bind
.Tutaj są fajne odpowiedzi i zgadzam się z @Austin Greco (druga opcja z osobnymi komponentami)
Jest inny sposób, w jaki lubię, curry .
Możesz stworzyć funkcję, która akceptuje parametr (twój parametr) i zwraca inną funkcję, która akceptuje inny parametr (w tym przypadku zdarzenie kliknięcia). możesz robić z tym, co chcesz.
ES5:
ES6:
I wykorzystasz to w ten sposób:
Oto pełny przykład takiego użycia:
Pokaż fragment kodu
Zauważ, że to podejście nie rozwiązuje problemu tworzenia nowej instancji na każdym renderowaniu.
Podoba mi się to podejście w porównaniu do innych programów obsługi inline, ponieważ moim zdaniem jest to bardziej zwięzłe i czytelne.
Edycja:
Jak sugerowano w komentarzach poniżej, możesz buforować / zapamiętać wynik działania funkcji.
Oto naiwna implementacja:
Pokaż fragment kodu
źródło
handleChange = param => cache[param] || (e => { // the function body })
Obecnie, przy ES6, czuję, że moglibyśmy skorzystać ze zaktualizowanej odpowiedzi.
Zasadniczo (dla tych, którzy nie wiedzą), ponieważ
onClick
oczekuje, że funkcja zostanie do niej przekazana,bind
działa, ponieważ tworzy kopię funkcji. Zamiast tego możemy przekazać wyrażenie funkcji strzałki, które po prostu wywołuje żądaną funkcję i zachowujethis
. Nigdy nie powinieneś wiązaćrender
metody w React, ale jeśli z jakiegoś powodu przegrywaszthis
jedną z metod składowych:źródło
render()
ponieważ jest wywoływany przez React. Jeśli już, potrzebujeszbind
obsługi zdarzeń i tylko wtedy, gdy nie używasz strzałek.props
sięsuper()
lubthis.props
zostanie undefined konstruktora, który może się okazać niejasna.foo = () => {...}
a następnie odwołać się w renderowaniu,<button onClick={this.foo}...
jedynym powodem do włączenia funkcji strzałki, jeśli używasz Babel w ten sposób, IMO, jest, jeśli chcesz uchwycić jakąś zmienną, która istnieje tylko w zakresie metody render () (zdarzenia mogą być po prostu przekazywane i nie mają zastosowania).[[h / t do @ E.Sundin za linkowanie tego w komentarzu]
Najlepsza odpowiedź (funkcje anonimowe lub wiązanie) będzie działać, ale nie jest najbardziej wydajna, ponieważ tworzy kopię procedury obsługi zdarzeń dla każdej instancji wygenerowanej przez
map()
funkcję.To jest wyjaśnienie optymalnego sposobu na zrobienie tego z wtyczki ESLint-reaguj :
źródło
this.state
, możesz go bezpiecznie wymienić za pomocą SFC.To jest moje podejście, nie jestem pewien, jak źle jest, proszę o komentarz
W klikalnym elemencie
i wtedy
źródło
encodeURIComponent(JSON.stringify(myObj))
, to aby go analizować,JSON.parse(decodeURIComponent(myObj))
. W przypadku funkcji jestem prawie pewien, że to nie zadziała bez eval lub nowej Function (), których należy unikać. Z tych powodów nie używam atrybutów danych do przekazywania danych w React / JS.ten przykład może się nieco różnić od twojego. ale zapewniam, że jest to najlepsze rozwiązanie tego problemu. szukałem dni od rozwiązania, które nie ma problemu z wydajnością. i wreszcie wymyślił ten.
AKTUALIZACJA
na przykład chcesz poradzić sobie z obiektami, które mają być parametrami. możesz użyć
JSON.stringify(object)
do przekonwertowania go na ciąg i dodania do zestawu danych.źródło
źródło
Jeszcze jedną opcją nie angażującą
.bind
ani ES6 jest użycie komponentu potomnego z modułem obsługi do wywołania modułu nadrzędnego z niezbędnymi rekwizytami. Oto przykład (a link do działającego przykładu znajduje się poniżej):Podstawową ideą jest przekazanie
onClick
funkcji przez komponent nadrzędny do komponentu potomnego. Komponent potomny wywołujeonClick
funkcję i może uzyskiwać dostęp do wszystkichprops
przekazanych do niej (ievent
) elementów, umożliwiając użycie dowolnejevent
wartości lub innych rekwizytów w obrębie elementu nadrzędnegoonClick
.Oto demo CodePen pokazujące tę metodę w akcji.
źródło
Zdaję sobie sprawę, że impreza jest dość późna, ale myślę, że o wiele prostsze rozwiązanie może zaspokoić wiele przypadków użycia:
Zakładam, że możesz również użyć
data-
atrybutu.Prosty, semantyczny.
źródło
Po prostu utwórz taką funkcję
i nazwij to w miejscu, którego potrzebujesz
<Icon onClick = {() => {methodName (theParamsYouwantToPass); }} />
źródło
Podejmowanie alternatywnej próby odpowiedzi na pytanie OP, w tym wywołań e.preventDefault ():
Renderowany link ( ES6 )
Funkcja elementu
źródło
Możesz po prostu to zrobić, jeśli używasz
ES6
.źródło
Wdrożenie pokazuje całkowitą liczbę z obiektu poprzez przekazanie licznika jako parametru z głównego do podskładników, jak opisano poniżej.
Oto MainComponent.js
I oto jest
SubComp.js
Spróbuj zaimplementować powyżej, a otrzymasz dokładny scenariusz, w którym parametry przekazywania działają w reakcjach dla dowolnej metody DOM.
źródło
Napisałem element opakowania, który można ponownie wykorzystać w tym celu, który opiera się na zaakceptowanych odpowiedziach tutaj. Jeśli wszystko, co musisz zrobić, to przekazać ciąg znaków, po prostu dodaj atrybut danych i przeczytaj go z e.target.dataset (jak sugerują niektórzy inni). Domyślnie mój wrapper wiąże się z dowolnym rekwizytem, który jest funkcją i zaczyna się od „on” i automatycznie przekazuje rekwizyt danych z powrotem do programu wywołującego po wszystkich innych argumentach zdarzenia. Chociaż nie przetestowałem go pod kątem wydajności, da ci to możliwość uniknięcia samodzielnego tworzenia klasy i można go użyć w następujący sposób:
lub w przypadku komponentów i funkcji
lub jeśli wolisz
oświadcz, że poza kontenerem (w pobliżu importu)
Oto użycie w kontenerze:
Oto kod opakowania „withData.js:
źródło
Mam poniżej 3 sugestii dotyczących tego zdarzenia w JSX onClick Events -
W rzeczywistości nie musimy używać .bind () ani funkcji Arrow w naszym kodzie. Możesz w prosty sposób użyć w swoim kodzie.
Możesz także przenieść zdarzenie onClick z th (lub ul) do tr (lub li), aby poprawić wydajność. Zasadniczo będziesz mieć n liczby „Detektorów zdarzeń” dla swojego elementu n li.
// I można uzyskać dostęp
item.id
wonItemClick
sposób, jak pokazano poniżej:Zgadzam się z powyższym podejściem do tworzenia osobnego React Component dla ListItem i List. Sprawia to, że kod wygląda dobrze, ale jeśli masz 1000 li, to zostanie utworzonych 1000 detektorów zdarzeń. Upewnij się, że nie powinieneś mieć dużo detektora zdarzeń.
źródło
Dodałem kod do przekazywania wartości zdarzenia onclick do metody na dwa sposoby. 1. przy użyciu metody powiązania 2. przy użyciu metody strzałki (=>). zobacz metody handlesort1 i handlesort
źródło
Poniżej znajduje się przykład, który przekazuje wartość zdarzenia onClick.
Użyłem składni es6. zapamiętaj w klasie funkcja strzałki nie wiąże się automatycznie, więc jawnie wiąże się w konstruktorze.
źródło
Myślę, że będziesz musiał powiązać metodę z instancją klasy React. Bezpieczniej jest użyć konstruktora do powiązania wszystkich metod w React. W twoim przypadku, gdy przekazujesz parametr do metody, pierwszy parametr służy do powiązania kontekstu „this” metody, więc nie możesz uzyskać dostępu do wartości wewnątrz metody.
źródło
źródło
Jest to bardzo łatwy sposób.
źródło
źródło
Wychodzę znikąd z tego pytania, ale myślę
.bind
, że zrobi to samo. Znajdź przykładowy kod poniżej.źródło
Korzystanie z funkcji strzałki:
Musisz zainstalować etap 2:
npm install babel-preset-stage-2:
źródło
Istnieją 3 sposoby, aby sobie z tym poradzić:
Powiąż metodę w konstruktorze jako:
Użyj funkcji strzałki podczas tworzenia jej jako:
Trzeci sposób to:
źródło
Możesz użyć swojego kodu w następujący sposób:
Tutaj jest dla obiektu zdarzenia, jeśli chcesz użyć metod zdarzenia, takich jak
preventDefault()
w funkcji uchwytu lub chcesz uzyskać wartość docelową lub nazwę jake.target.name
.źródło
Znalazłem rozwiązanie przekazywania parametru param jako atrybutu tagu całkiem rozsądne.
Ma jednak ograniczenia:
Właśnie dlatego wymyśliłem tę bibliotekę: reaguj-zdarzenie-parametr
To:
Przykład użycia:
źródło
Było wiele kwestii związanych z wydajnością, wszystko w próżni.
Problem z tymi procedurami obsługi polega na tym, że musisz je curry, aby uwzględnić argument, którego nie można wymienić w rekwizytach.
Oznacza to, że komponent potrzebuje modułu obsługi dla każdego klikalnego elementu. Zgódźmy się, że dla kilku przycisków to nie jest problem, prawda?
Problem pojawia się podczas obsługi danych tabelarycznych z dziesiątkami kolumn i tysiącami wierszy. Tam zauważasz wpływ stworzenia tak wielu programów obsługi.
Faktem jest, że potrzebuję tylko jednego.
Ustawiam moduł obsługi na poziomie tabeli (lub UL lub OL ...), a po kliknięciu mogę stwierdzić, która komórka została kliknięta, używając danych dostępnych od zawsze w obiekcie zdarzenia:
Korzystam z pól zmiennych, aby sprawdzić, czy kliknięcie nastąpiło w prawidłowym elemencie, na przykład ignoruję kliknięcia w TH stopek.
RowIndex i cellIndex podają dokładną lokalizację klikniętej komórki.
Textcontent to tekst klikniętej komórki.
W ten sposób nie muszę przekazywać danych komórki do modułu obsługi, może to samoobsługi.
Jeśli potrzebuję więcej danych, danych, które nie mają być wyświetlane, mogę użyć atrybutu zestawu danych lub ukrytych elementów.
Z prostą nawigacją DOM wszystko jest pod ręką.
Jest to stosowane w HTML od zawsze, ponieważ komputery PC były znacznie łatwiejsze do bagna.
źródło
Istnieje kilka sposobów przekazywania parametrów w procedurach obsługi zdarzeń, niektóre są następujące.
Możesz użyć funkcji strzałki, aby owinąć moduł obsługi zdarzeń i przekazać parametry:
powyższy przykład jest równoważny z wywołaniem
.bind
lub możesz jawnie wywołać bind.Oprócz tych dwóch podejść można także przekazywać argumenty do funkcji zdefiniowanej jako funkcja curry.
źródło
Użyj zamknięcia , aby uzyskać czyste rozwiązanie:
<th onClick={this.handleSort(column)} >{column}</th>
Funkcja handleSort zwróci funkcję, dla której kolumna wartości jest już ustawiona.
Funkcja anonimowa zostanie wywołana z poprawną wartością, gdy użytkownik kliknie th.
Przykład: https://stackblitz.com/edit/react-pass-parameters-example
źródło
Wymagana prosta zmiana:
Posługiwać się
<th value={column} onClick={that.handleSort} >{column}</th>
zamiast
<th value={column} onClick={that.handleSort} >{column}</th>
źródło