Ostrzeżenie: składnik zmienia niekontrolowane wprowadzanie tekstu tekstowego, który ma być kontrolowany. Elementy wejściowe nie powinny przełączać się z niekontrolowanego na kontrolowane (lub odwrotnie). Wybierz między użyciem kontrolowanego lub niekontrolowanego elementu wejściowego przez cały okres użytkowania komponentu. *
Oto mój kod:
constructor(props) {
super(props);
this.state = {
fields: {},
errors: {}
}
this.onSubmit = this.onSubmit.bind(this);
}
....
onChange(field, e){
let fields = this.state.fields;
fields[field] = e.target.value;
this.setState({fields});
}
....
render() {
return(
<div className="form-group">
<input
value={this.state.fields["name"]}
onChange={this.onChange.bind(this, "name")}
className="form-control"
type="text"
refs="name"
placeholder="Name *"
/>
<span style={{color: "red"}}>{this.state.errors["name"]}</span>
</div>
)
}
javascript
reactjs
Riya Kapuria
źródło
źródło
fields
w stanie?Odpowiedzi:
Powodem jest, w stanie, który zdefiniowałeś:
pola jako pusty obiekt, więc podczas pierwszego renderowania
this.state.fields.name
będzieundefined
, a pole wejściowe otrzyma swoją wartość jako:Z tego powodu pole wejściowe stanie się niekontrolowane.
Po wprowadzeniu dowolnej wartości na wejściu
fields
stan zmienia się na:W tym czasie pole wejściowe zostaje przekształcone w kontrolowany komponent; dlatego pojawia się błąd:
Możliwe rozwiązania:
1- Zdefiniuj
fields
stan w:2- Lub zdefiniuj właściwość wartości za pomocą oceny zwarcia w następujący sposób:
źródło
''
jest poprawną wartością ciągu. więc kiedy zmienisz''
na „xyz”, typ danych wejściowych nie zmienia środków kontrolowanych na kontrolowane. Jednak w przypadkuundefined
doxyz
rodzaju zmieni się z niekontrolowanym do kontrolowany.value={this.state.fields.name || ''}
Zmiana
value
nadefaultValue
to rozwiąże.Uwaga :
Kiedyś
value={this.state.input ||""}
winput
pozbyć się tego ostrzeżenia.źródło
Wewnątrz komponentu umieść pole wprowadzania w następujący sposób.
źródło
PO PROSTU, najpierw musisz ustawić stan początkowy
Jeśli nie ustawisz stanu początkowego, zareaguj potraktuje to jako niekontrolowany komponent
źródło
Oprócz zaakceptowanej odpowiedzi, jeśli używasz
input
typucheckbox
lubradio
, stwierdziłem, że muszę również zerować / niezdefiniować sprawdzeniechecked
atrybutu.A jeśli używasz TS (lub Babel), możesz użyć zerowego koalescencji zamiast logicznego operatora OR:
źródło
Najpierw ustaw bieżący stan
...this.state
Dzieje się tak, ponieważ gdy zamierzasz przypisać nowy stan, może on być niezdefiniowany. więc zostanie to naprawione poprzez ustawienie stanu wyodrębniania bieżącego stanu również
Jeśli w twoim stanie jest obiekt, powinieneś ustawić go w następujący sposób, załóżmy, że musisz ustawić nazwę użytkownika wewnątrz obiektu użytkownika.
źródło
generuje błąd, gdy tylko wpiszesz w polu tekstowym
naprawi problem na tym przykładzie ciągu.
źródło
Jeśli używasz wielu danych wejściowych w polu, wykonaj następujące czynności: Na przykład:
Wyszukaj swój problem na:
źródło
Używając React Hook również nie zapomnij ustawić wartości początkowej.
Używałem
<input type='datetime-local' value={eventStart} />
i początkowyeventStart
był jakconst [eventStart, setEventStart] = useState();
zamiast tego
const [eventStart, setEventStart] = useState('');
.Pusty ciąg w nawiasach to różnica.
Ponadto, jeśli zresetujesz formularz po przesłaniu, tak jak ja, ponownie musisz ustawić go jako pusty ciąg, a nie tylko puste nawiasy.
To tylko mój mały wkład w ten temat, może komuś pomoże.
źródło
W moim przypadku było tak, jak mówi najlepsza odpowiedź Mayanka Shukli. Jedynym szczegółem było to, że w moim stanie brakowało całkowicie właściwości, którą definiowałem.
Na przykład, jeśli masz ten stan:
Jeśli rozwijasz swój kod, możesz dodać nowy rekwizyt, więc w innym miejscu w kodzie możesz utworzyć nową właściwość,
c
której wartość jest nie tylko niezdefiniowana w stanie składnika, ale sama właściwość jest niezdefiniowana.Aby rozwiązać ten problem, po prostu dodaj
c
do swojego stanu i nadaj mu odpowiednią wartość początkową.na przykład,
Mam nadzieję, że udało mi się wyjaśnić mój przypadek.
źródło
Otrzymuję to samo ostrzeżenie: komponent zmienia niekontrolowane dane wejściowe typu ukryte, aby je kontrolować. Nie mogę naprawić mojego problemu. Jakieś pomysły, dlaczego?
próbowałem
({ valueName, valueName: {geschlecht=""}, onChangeAllg,})
ivalue={valueName.geschlecht || ""}
źródło
defaultValue={""}
Wewnątrz TextField brakowałoOstrzeżenie: składnik zmienia niekontrolowane wprowadzanie tekstu tekstowego, który ma być kontrolowany. Elementy wejściowe nie powinny przełączać się z niekontrolowanego na kontrolowane (lub odwrotnie). Wybierz pomiędzy użyciem kontrolowanego lub niekontrolowanego elementu wejściowego przez cały okres użytkowania komponentu.
Rozwiązanie: Sprawdź, czy wartość nie jest niezdefiniowana
React / Formik / Bootstrap / TypeScript
przykład:
źródło