Jestem nowy w ReactJS, przepraszam, jeśli to zabrzmi. Mam komponent, który tworzy kilka wierszy tabeli zgodnie z otrzymanymi danymi.
Każda komórka w kolumnie ma pole wyboru radia. Dlatego użytkownik może wybrać jeden site_name
i jeden address
z istniejących wierszy. Wybór należy pokazać w stopce. I tam utknąłem.
var SearchResult = React.createClass({
render: function(){
var resultRows = this.props.data.map(function(result){
return (
<tbody>
<tr>
<td><input type="radio" name="site_name" value={result.SITE_NAME}>{result.SITE_NAME}</input></td>
<td><input type="radio" name="address" value={result.ADDRESS}>{result.ADDRESS}</input></td>
</tr>
</tbody>
);
});
return (
<table className="table">
<thead>
<tr>
<th>Name</th>
<th>Address</th>
</tr>
</thead>
{resultRows}
<tfoot>
<tr>
<td>chosen site name ???? </td>
<td>chosen address ????? </td>
</tr>
</tfoot>
</table>
);
}
});
W jQuery mogłem zrobić coś takiego, $("input[name=site_name]:checked").val()
aby uzyskać wybór jednego rodzaju pola wyboru radia i wstawić go do pierwszej komórki stopki.
Ale z pewnością musi istnieć sposób Reactja, którego zupełnie mi brakuje? Wielkie dzięki
input
elementy nie mają treści. Więc<input>content</input>
nie ma sensu i jest nieważny. Możesz chcieć<label><input />content</label>
.Odpowiedzi:
Wszelkie zmiany w renderowaniu powinny być zmieniane za pomocą
state
lubprops
( reaguj doc ).Tutaj rejestruję zdarzenie wejściowe, a następnie zmieniam
state
, co spowoduje wyświetlenie renderowania w stopce.jsbin
źródło
}, this);
poniżej</tbody>
. Co to jest i co robi? Zauważyłem bez tego, że kod ulega awarii.this
Jest kontekst przekazany domap
funkcji . To była edycja autorstwa @FakeRainBrigand, dobry chwyt! Bez tego twojathis
funkcja na mapie odniesie się dowindow
, który nie ma pojęcia o costate
chodzithis
sztuczka jest niepotrzebna, jeśli używasz strzałki ES6 zamiast zwykłej funkcji. Np .:var resultRows = this.props.data.map((result) => { ... });
Wspominam o tym tylko dlatego, że Reagenci zwykle już używają jakiejś formy transpilacji (dla JSX), więc ES6 jest zazwyczaj w zasięgu ręki.onInputChange (e) {this.setState({ [e.target.name]: e.target.value }); }
Oto najprostszy sposób implementacji przycisków radiowych w reakcji js.
Edytowane
Możesz użyć funkcji strzałki zamiast wiązania. Zamień powyższy kod na
<div onChange={event => this.setGender(event)}>
W przypadku wartości domyślnej użyj
defaultChecked
tegoźródło
.bind(this)
że za każdym razem stworzy nową funkcję. Oznacza to, że gdy zareaguje, sprawdzi, czy coś się nie zmieniło w wirtualnym DOM, ten komponent zawsze będzie inny i zawsze będzie wymagał ponownego renderowania.name
rekwizyt. Oba są owinięte w div, który maonChange
moduł obsługi opisany w tej odpowiedzi. Klikam pierwsze radio, wydarzenie jest uruchamiane. Klikam drugie radio, wydarzenie jest uruchamiane. Jednak po raz trzeci żadne zdarzenie nie jest uruchamiane. Czemu?Na podstawie tego, co mówią dokumenty React :
Na przykład:
Link do przykładu: https://codesandbox.io/s/6l6v9p0qkr
Na początku żaden z przycisków opcji nie jest zaznaczony, więc
this.state
jest pustym obiektem, ale za każdym razem, gdy wybranythis.state
zostanie przycisk opcji, otrzymuje nową właściwość z nazwą wejścia i jego wartością. Ułatwia to sprawdzenie, czy użytkownik wybrał dowolny przycisk opcji, taki jak:EDYTOWAĆ:
W wersji 16.7-alpha React istnieje propozycja czegoś o nazwie,
hooks
która pozwoli ci robić takie rzeczy łatwiej:W poniższym przykładzie są dwie grupy przycisków opcji w komponencie funkcjonalnym. Mimo to mają kontrolowane dane wejściowe:
Przykład działania: https://codesandbox.io/s/6l6v9p0qkr
źródło
Ustaw komponent radiowy jako głupi i przekaż rekwizyty rodzicowi.
źródło
Pomysł tutaj: jeśli chodzi o wejścia radiowe w React, zwykle renderuję je wszystkie w inny sposób, jak wspomniano w poprzednich odpowiedziach.
Jeśli to może pomóc każdemu, kto musi renderować wiele przycisków opcji:
źródło
checked={ this.state.gender === value }
. Komponenty funkcjonalne nie mająthis
.źródło
Kliknięcie przycisku opcji powinno wywołać zdarzenie, które:
self.props.selectionChanged(...)
W pierwszym przypadku zmiana stanu spowoduje ponowne renderowanie i możesz to zrobić
<td>chosen site name {this.state.chosenSiteName} </td>
w drugim przypadku źródło oddzwaniania zaktualizuje rzeczy, aby upewnić się, że w dalszej kolejności instancja SearchResult będzie miała w swojej rekwizytach nazwęSiteName i selectedAddress.
źródło
Opierając się na odpowiedzi ChinKanga, powiedziałem, że mam bardziej suche podejście i w es6 dla zainteresowanych:
z wyjątkiem tego, że miałby domyślną sprawdzoną wartość.
źródło
Byłem również zdezorientowany w radiu, realizacja pola wyboru. To, czego potrzebujemy, to posłuchaj zmiany zdarzenia radiowego, a następnie ustaw stan. Dałem mały przykład doboru płci.
źródło
Bootstrap, robimy to w ten sposób:
źródło