W komponencie React dla <select>
menu muszę ustawić selected
atrybut w opcji odzwierciedlającej stan aplikacji.
W render()
The optionState
przechodzi od właściciela państwowego do składnika SortMenu. Wartości opcji są przekazywane props
od JSON.
render: function() {
var options = [],
optionState = this.props.optionState;
this.props.options.forEach(function(option) {
var selected = (optionState === option.value) ? ' selected' : '';
options.push(
<option value={option.value}{selected}>{option.label}</option>
);
});
// pass {options} to the select menu jsx
Wywołuje to jednak błąd składniowy kompilacji JSX.
W ten sposób pozbywasz się błędu składniowego, ale oczywiście nie rozwiązuje problemu:
var selected = (optionState === option.value) ? 'selected' : 'false';
<option value={option.value} selected={selected}>{option.label}</option>
Próbowałem także:
var selected = (optionState === option.value) ? true : false;
<option value={option.value} {selected ? 'selected' : ''}>{option.label}</option>
Czy istnieje zalecany sposób rozwiązania tego problemu?
javascript
reactjs
Cantera
źródło
źródło
Odpowiedzi:
React automatycznie rozumie booleany w tym celu, więc możesz po prostu pisać (uwaga: niezalecane)
i odpowiednio wyświetli „wybrane”.
Jednak React sprawia, że jest to jeszcze łatwiejsze. Zamiast definiować
selected
każdą opcję, możesz (i powinieneś) po prostu napisaćvalue={optionsState}
na samym tagu select :Aby uzyskać więcej informacji, zobacz dokument React select tag .
źródło
onChange={this.handleSelect}
i ustawić wartość stanu dla swojego komponentu, na przykład: „handleSelect: function () {this.setState ({value: event.target.value});}„ Spowoduje to ponowne wysłanie wybranego komponentu z nowym wybrany przedmiot. Mam nadzieję, że to ci pomoże.value
rekwizyt na a<select>
może być tablicą, jeślimultiselect
włączyłeś.defaultValue
do inicjalizacjiMożesz zrobić to, co ostrzega React, próbując ustawić właściwość „selected”
<option>
:Tak, można używać
options.value
nadefaultValue
twoich wybierzźródło
Oto kompletne rozwiązanie, które zawiera najlepszą odpowiedź i komentarze poniżej (które mogą pomóc komuś, kto stara się to wszystko ułożyć):
AKTUALIZACJA DLA ES6 (2019) - przy użyciu funkcji strzałek i niszczenia obiektów
w głównym składniku:
dołączony komponent (który jest teraz funkcją bezstanową):
POPRZEDNIA ODPOWIEDŹ (używając binda):
w głównym składniku:
dołączony komponent (który jest teraz funkcją bezstanową):
główny składnik zachowuje wybraną wartość dla owoców (w stanie), dołączony składnik wyświetla wybrany element i aktualizacje są przekazywane z powrotem do głównego składnika w celu zaktualizowania jego stanu (który następnie zapętla się z powrotem do dołączonego składnika, aby zmienić wybraną wartość).
Zwróć uwagę na użycie nazwy prop, która pozwala zadeklarować pojedynczą metodę handleChange dla innych pól w tym samym formularzu, niezależnie od ich typu.
źródło
this.handleChange.bind(this);
powinna byćthis.handleChange = this.handleChange.bind(this)
;Oto najnowszy przykład tego, jak to zrobić. Od reagują docs oraz automatycznie wiążącą składnię metody „fat-arrow”.
źródło
Po prostu dodaj jako pierwszą opcję wybranego tagu:
Stanie się to domyślne, a kiedy wybierzesz prawidłową opcję, zostanie ustawiona w twoim stanie
źródło
źródło
Mam problem z tym, że
<select>
tagi nie aktualizują się poprawnie<option>
po zmianie stanu. Mój problem zdawał się polegać na tym, że jeśli renderujesz dwa razy w krótkich odstępach czasu, za pierwszym razem bez uprzednio zaznaczonego,<option>
ale za drugim razem z jednym, wtedy<select>
znacznik nie aktualizuje się przy drugim renderowaniu, ale pozostaje domyślnie pierwszy.Znalazłem rozwiązanie tego problemu za pomocą referencji . Musisz uzyskać odniesienie do
<select>
węzła znacznika (który może być zagnieżdżony w jakimś komponencie), a następnie ręcznie zaktualizowaćvalue
właściwość na nim, w punkciecomponentDidUpdate
zaczepienia.źródło
Publikowanie podobnej odpowiedzi dla MULTISELECT / optgroups:
źródło
Mam proste rozwiązanie jest zgodne z podstawowym HTML.
.text-hide
jest klasą bootstrap, jeśli nie używasz bootstrap, oto jesteś:źródło
Rozwiązałem podobny problem, ustawiając defaultProps:
<select value="this.props.propName" ...
Więc teraz unikam błędów przy kompilacji, jeśli mój rekwizyt nie istnieje przed montażem.
źródło
value
Podałeś rekwizyt do pola formularza bezonChange
modułu obsługi. Spowoduje to renderowanie pola tylko do odczytu. Jeśli pole powinno być zmienne, użyjdefaultValue
. W przeciwnym razie, należy ustawić alboonChange
alboreadOnly
.