Pojedyncza linia działa dobrze
render: function () {
return (
{[1,2,3].map(function (n) {
return <p>{n}</p>
}}
);
}
nie dla wielu linii
render: function () {
return (
{[1,2,3].map(function (n) {
return (
<h3>Item {n}</h3>
<p>Description {n}</p>
)
}}
);
}
Dzięki.
return ("asdf" "asdf");
chceszreturn ["asdf", "asdf"];
Odpowiedzi:
Spróbuj myśleć o tagach jako o wywołaniach funkcji (zobacz dokumentację ). Wtedy pierwszy staje się:
A drugi:
Powinno być teraz jasne, że drugi fragment kodu tak naprawdę nie ma sensu (nie możesz zwrócić więcej niż jednej wartości w JS). Musisz albo zawinąć go w inny element (najprawdopodobniej to, co chcesz, w ten sposób możesz również podać prawidłową
key
właściwość) lub możesz użyć czegoś takiego:Z cukrem JSX:
Nie musisz spłaszczać wynikowej tablicy, React zrobi to za Ciebie. Zobacz następujące skrzypce http://jsfiddle.net/mEB2V/1/ . Ponownie: zawinięcie dwóch elementów w div / section będzie najprawdopodobniej lepsze na dłuższą metę.
źródło
Uncaught Error: Invariant Violation: Product.render(): A valid ReactComponent must be returned. You may have returned undefined, an array or some other invalid object.
<div>{ this.props.foos.map(function() { return <Foo /> }) }</div>
. Alerender
funkcja komponentu nie może zwrócić tej tablicy bez jej opakowania, np. W div.Wygląda na to, że stara odpowiedź dotycząca zwracania tablicy już nie ma zastosowania (może od czasu React ~ 0.9, jak @ dogmatic69 napisał w komentarzu ).
Dokumenty mówią, że musisz zwrócić pojedynczy węzeł:
W wielu przypadkach możesz po prostu zawinąć rzeczy w plik a
<div>
lub a<span>
.W moim przypadku chciałem zwrócić wiele
<tr>
s. Owinąłem je w<tbody>
- stół może mieć wiele ciał.EDYCJA: Od React 16.0 zwracanie tablicy jest najwyraźniej znowu dozwolone, o ile każdy element ma
key
: https://facebook.github.io/react/blog/2017/09/26/react-v16.0.html # new-render-return-types-fragments-and-stringsEDYCJA: React 16.2 pozwala otoczyć listę elementów tablicą
<Fragment>…</Fragment>
lub nawet<>…</>
, jeśli wolisz, że: https://blog.jmes.tech/react-fragment-and-semantic-html/źródło
<li>
? Zakładając, że nie mogę po prostu tego wszystkiego<ul>
<li><ul><li>one</li><li>two</li></ul></li>
, jak to działa w Twojej sytuacji. Lub: opakowujący element div nie byłby prawidłowy, ale może renderuje się dobrze we wszystkich odpowiednich przeglądarkach? Jeśli spróbujesz, daj nam znać.li
w aspan
lubdiv
nie działało dobrze dla mnie. Div poważnie zepsuł renderowanie i, przynajmniej w moim przypadku, rozpiętość zepsuła CSS. 2 ¢: Próba zwrócenia kilku podzbiorówli
s to zapach kodu. Używaliśmyul
jako swego rodzaju menu rozwijanego i początkowo chciałem, aby wiele komponentów zwracało „sekcje”li
s. Ostatecznie lepiej było umieścić cały kod menu w jednym „zakotwiczonym” elemencieul
niż w łyżce do butówli
z wielu źródeł. Myślę, że dzięki temu model mentalny interfejsu użytkownika stał się nieco czystszy.Począwszy od wersji 16.0.0 Reacta możliwe jest zwrócenie wielu elementów poprzez umieszczenie ich w pliku
Array
Również w React 16.2.0 wprowadzono nową funkcję o nazwie,
React Fragments
której można użyć do zawijania wielu elementówZgodnie z dokumentacją:
źródło
Możesz także chcieć zwrócić kilka elementów listy w jakiejś funkcji pomocniczej wewnątrz komponentu React. Po prostu zwróć tablicę węzłów html z
key
atrybutem:źródło
Możesz użyć
createFragment
tutaj.https://facebook.github.io/react/docs/create-fragment.html
(używając tutaj składni ES6 i JSX)
najpierw musisz dodać
react-addons-create-fragment
pakiet:Przewaga nad rozwiązaniem Jana Olafa Kremsa: reaguj, nie narzekaj na zaginięcie
key
źródło
Zaktualizowano
Użyj fragmentu reakcji. To proste. Link do fragmentowej dokumentacji.
Stara odpowiedź - nieaktualna
W przypadku React> 16 możesz użyć kompozytu reagującego .
Oczywiście należy zainstalować kompozyt reakcyjny.
źródło
Jest to proste przez fragment Reacta
<></>
iReact.Fragment
:źródło