W funkcji renderowania mojego komponentu mam:
render() {
const items = ['EN', 'IT', 'FR', 'GR', 'RU'].map((item) => {
return (<li onClick={this.onItemClick.bind(this, item)} key={item}>{item}</li>);
});
return (
<div>
...
<ul>
{items}
</ul>
...
</div>
);
}
wszystko renderuje się dobrze, jednak po kliknięciu <li>
elementu pojawia się następujący błąd:
Nieprzechwycony błąd: Niezmienne naruszenie: Obiekty nie są poprawne jako dziecko React (znaleziono: obiekt z kluczami {dispatchConfig, dispatchMarker, nativeEvent, target, currentTarget, typ, eventPhase, bąbelki, można anulować, timeStamp, defaultPrevented, isTrusted, widok, szczegół, screenX , screenY, clientX, clientY, ctrlKey, shiftKey, altKey, metaKey, getModifierState, przycisk, przyciski, relatedTarget, pageX, pageY, isDefaultPrevented, isPropagationStopped, _dispatchListeners, _dispatchIDs}). Jeśli chcesz wyrenderować kolekcję dzieci, użyj zamiast tego tablicy lub zawiń obiekt za pomocą createFragment (obiektu) z dodatków React. Sprawdź metodę renderowania dla
Welcome
.
Jeśli zmienię się this.onItemClick.bind(this, item)
do (e) => onItemClick(e, item)
wewnątrz funkcji map wszystko działa zgodnie z oczekiwaniami.
Gdyby ktoś mógł wyjaśnić, co robię źle i wyjaśnić, dlaczego dostaję ten błąd, byłoby świetnie
AKTUALIZACJA 1:
Funkcja onItemClick jest następująca, a usunięcie this.setState powoduje zniknięcie błędu.
onItemClick(e, item) {
this.setState({
lang: item,
});
}
Ale nie mogę usunąć tej linii, ponieważ muszę zaktualizować stan tego komponentu
źródło
this.onItemClick
jest wdrażany?Odpowiedzi:
Wystąpił ten błąd i okazało się, że nieumyślnie włączyłem Obiekt do mojego kodu JSX, który powinien być wartością ciągu:
breadcrumbElement
kiedyś był łańcuchem, ale z powodu refaktora stał się Obiektem. Niestety komunikat o błędzie React nie wykonał dobrej roboty, wskazując mi linię, w której występował problem. Musiałem śledzić ślad stosu aż do momentu, gdy rozpoznałem „rekwizyty” przekazywane do komponentu, a potem znalazłem kod, który go narusza.Musisz odwołać się do właściwości obiektu, która jest wartością ciągu lub przekonwertować obiekt na pożądaną reprezentację ciągu. Jedną z opcji może być,
JSON.stringify
jeśli naprawdę chcesz zobaczyć zawartość obiektu.źródło
Wystąpił więc ten błąd podczas próby wyświetlenia
createdAt
właściwości, która jest obiektem Date. Jeśli połączysz.toString()
w taki sposób, spowoduje to konwersję i wyeliminuje błąd. Po prostu opublikuj to jako możliwą odpowiedź na wypadek, gdyby ktoś napotkał ten sam problem:źródło
objects are not valid
niezmienne naruszenie tylko wtedy, gdy dodałem wiersz. Okazuje się, że przekształcałem obiekt Date () w ciąg przed utrwaleniem go, więc tylko moje nowe wiersze zawierały obiekty dla utworzonej daty. :( Ucz się od moich krnąbrnych przykładowych ludzi!Właśnie dostałem ten sam błąd, ale z powodu innego błędu: użyłem podwójnych nawiasów klamrowych, takich jak:
wstawić wartość
count
zamiast poprawnej:w który prawdopodobnie kompilator się zmienił
{{count: count}}
, tj. próbuje wstawić obiekt jako dziecko React.źródło
{}
. Para wewnętrzna traktowana jest jak kod ES6. W ES6{count}
jest taki sam jak{count: count}
. Więc kiedy piszesz{{count}}
, jest dokładnie tak samo jak{ {count: count} }
.this.state = {navMenuItems: {navMenu}};
... co w zasadzie zmieniło mój JSXnavMenu
w obiekt ogólny. Zmianathis.state = {navMenuItems: navMenu};
polegająca na pozbyciu się niezamierzonego „obsady”Object
i naprawieniu problemu.Pomyślałem, że dodałbym do tego, ponieważ miałem dzisiaj ten sam problem, okazuje się, że to dlatego, że zwróciłem tylko funkcję, kiedy owinąłem ją w
<div>
tag, zaczął działać, jak poniżejPowyższe spowodowało błąd. Rozwiązałem problem, zmieniając
return()
sekcję na:...lub po prostu:
źródło
return gallerySection
jeśli chcesz uniknąć dodatkowegodiv
gallerySection
zamiast<div>{gallerySection}</div>
mi pomógł.Dziecko podrzędne React (liczba pojedyncza) powinno być typem prymitywnego typu danych, a nie obiektem, lub może to być znacznik JSX (co nie jest w naszym przypadku) . Użyj pakietu Proptypes w fazie projektowania, aby mieć pewność, że nastąpi weryfikacja.
Wystarczy porównanie krótkiego fragmentu kodu (JSX), aby przedstawić Ci pomysł:
Błąd: z obiektem przekazywanym do dziecka
Bez błędu: z właściwością obiektu ( która powinna być prymitywna, tj. Wartością ciągu lub wartością całkowitą ) przekazywaną do potomka.
TLDR; (Ze źródła poniżej): Upewnij się, że wszystkie elementy renderowane w JSX są prymitywami, a nie obiektami podczas używania React. Ten błąd zwykle występuje, ponieważ funkcja zaangażowana w wywołanie zdarzenia otrzymała nieoczekiwany typ obiektu (tj. Przekazanie obiektu, gdy należy przekazać ciąg) lub część JSX w komponencie nie odwołuje się do operacji podstawowej (tj. This.props vs this.props.name).
Źródło - codingbismuth.com
źródło
return <p>{item.whatever}</p>;
Moje dotyczyło niepotrzebnego umieszczania nawiasów klamrowych wokół zmiennej zawierającej element HTML wewnątrz instrukcji return funkcji render (). To sprawiło, że React potraktował go raczej jako przedmiot niż element.
Po usunięciu nawiasów klamrowych z elementu błąd zniknął, a element został zrenderowany poprawnie.
źródło
Miałem do czynienia z zapominaniem o nawiasach klamrowych wokół rekwizytów wysyłanych do elementu prezentacyjnego:
Przed:
Po
źródło
Ja również otrzymywałem błąd „Obiekty nie są prawidłowe jako dziecko React” i dla mnie przyczyną było wywołanie funkcji asynchronicznej w moim JSX. Patrz poniżej.
Nauczyłem się, że renderowanie asynchroniczne nie jest obsługiwane w React. Zespół React pracuje nad rozwiązaniem opisanym tutaj .
źródło
Dla każdego, kto używa Firebase z Androidem, to tylko zepsuje Androida. Moja emulacja iOS ignoruje to.
I jak napisał Apoorv Bankey powyżej.
Wszystko powyżej Firebase V5.0.3, na Androida, bankomat jest przełomem. Naprawić:
Potwierdzony wiele razy tutaj https://github.com/firebase/firebase-js-sdk/issues/871
źródło
Mam również ten sam problem, ale mój błąd jest tak głupi. Próbowałem uzyskać dostęp do obiektu bezpośrednio.
źródło
Jeśli z jakiegoś powodu zaimportowałeś firebase. Następnie spróbuj uruchomić
npm i --save [email protected]
. Wynika to z tego, że przerwanie firebase-native reaguje, więc uruchomienie go naprawi.źródło
W moim przypadku zapomniałem zwrócić element HTML z funkcji renderowania i zwracałem obiekt. To, co zrobiłem, to właśnie otoczyłem {items} elementem html - prostym divem jak poniżej
źródło
Miałem ten sam problem, ponieważ nie włożyłem
props
nawiasów klamrowych.Więc jeśli twój kod jest podobny do powyższego, otrzymasz ten błąd. Aby rozwiązać ten problem, po prostu załóż nawiasy klamrowe wokół
props
.źródło
Mam ten sam błąd, zmieniłem to
export default withAlert(Alerts)
do tego
export default withAlert()(Alerts)
.W starszych wersjach poprzedni kod działał poprawnie, ale w późniejszych wersjach generuje błąd. Więc użyj późniejszego kodu, aby uniknąć błędu.
źródło
W moim przypadku wystąpił błąd, ponieważ zwróciłem tablicę elementów w nawiasach klamrowych, zamiast zwracać samą tablicę.
Kod z błędem
Poprawny kod
źródło
Po prostu używałeś kluczy obiektu zamiast całego obiektu!
Więcej informacji można znaleźć tutaj: https://github.com/gildata/RAIO/issues/48
źródło
Mam ten sam problem, w moim przypadku aktualizuję redux stan , a nowe parametry danych nie pasują do starych parametrów, więc kiedy chcę uzyskać dostęp do niektórych parametrów przez ten błąd,
Może to doświadczenie komuś pomoże
źródło
Jeśli używasz Firebase i widzisz ten błąd, warto sprawdzić, czy go poprawnie importujesz. Od wersji 5.0.4 musisz ją zaimportować w następujący sposób:
Tak, wiem. Też straciłem 45 minut.
źródło
Zazwyczaj pojawia się, ponieważ nie niszczysz poprawnie. Weźmy na przykład ten kod:
Deklarujemy to z
= text =>
param. Ale tak naprawdę React spodziewa się, że będzie to wszechogarniająceprops
obiekt.Więc naprawdę powinniśmy robić coś takiego:
Zauważ różnicę?
props
Param tutaj mógłby być nazwany coś (props
to tylko konwencja, który pasuje do nomenklatury), reagują właśnie spodziewa obiekt z kluczami i odstępach.Z destrukcją obiektów możesz zrobić i często zobaczysz coś takiego:
... który działa.
Jest szansa, że każdy, kto się na nią natknie, przypadkowo ogłosił, że rekwizyty swojego komponentu są param bez zniszczenia.
źródło
Właśnie przedstawiłem sobie naprawdę głupią wersję tego błędu, którą równie dobrze mogę udostępnić tutaj dla potomności.
Miałem trochę takich JSX:
Musiałem to skomentować, aby coś debugować. Użyłem skrótu klawiaturowego w moim IDE, co spowodowało:
Co oczywiście jest nieprawidłowe - obiekty nie są ważne, ponieważ reagują na nie dzieci!
źródło
Chciałbym dodać inne rozwiązanie do tej listy.
Okular:
Napotkałem ten sam błąd:
To był mój kod:
Rozwiązanie:
Problem występował, ponieważ ładunek wysyłał element jako obiekt. Kiedy usunąłem zmienną ładunku i wstawiłem wartość userInput do wysyłki, wszystko zaczęło działać zgodnie z oczekiwaniami.
źródło
Jeśli w przypadku korzystania z Firebase którykolwiek z plików w projekcie. Następnie umieść tę instrukcję importu firebase na końcu !!
Wiem, że to brzmi szalenie, ale spróbuj !!
źródło
Mój problem był prosty, gdy napotkałem następujący błąd:
po prostu przekazałem obiekt z kluczami określonymi w błędzie podczas próby renderowania obiektu bezpośrednio w komponencie przy użyciu {object} oczekując, że będzie to ciąg znaków
podczas renderowania na React Component użyłem czegoś takiego jak poniżej
ale powinno być
źródło
Jeśli korzystasz ze składników bezstanowych, zastosuj ten format:
Wydawało mi się, że to działa
źródło
Coś takiego właśnie mi się przytrafiło ...
Napisałem:
Umieszczenie go w div naprawiło:
źródło
Co oznacza, że przekazanie czegoś jest kluczową wartością. Musisz więc zmodyfikować program obsługi:
od doBrakowało ci nawiasów klamrowych (
{}
).źródło
W moim przypadku dodałem asynchronię do komponentu funkcji potomnej i napotkałem ten błąd. Nie używaj asynchronizacji ze składnikiem potomnym.
źródło
W przypadku korzystania z Firebase, jeśli to nie działa, umieszczając na końcu
import
instrukcji, możesz spróbować umieścić to w jednej z metod cyklu życia, to znaczy, możesz umieścić to w środkucomponentWillMount()
.źródło
Invariant Violation: Objects are not valid as a React child
przydarzyło mi się, gdy korzystałem ze składnika wymagającegorenderItem
rekwizytów, takiego jak:a moim błędem było stworzenie mojej
renderItem
metodyasync
.źródło
Mój błąd polegał na tym, że napisałem to w ten sposób:
zamiast:
Oznaczało to, że próbowałem renderować obiekt zamiast wartości w nim zawartej.
edycja: służy do reagowania, a nie rodzimego.
źródło