Próbuję zrobić coś takiego w React JSX
(gdzie ObjectRow jest osobnym składnikiem):
<tbody>
for (var i=0; i < numrows; i++) {
<ObjectRow/>
}
</tbody>
Rozumiem i rozumiem, dlaczego to nie jest poprawne JSX
, skoro JSX
mapy do wywołań funkcji. Jednakże, pochodząc z szablonu i będąc nowym JSX
, nie jestem pewien, jak bym to osiągnął (wielokrotne dodawanie komponentu).
javascript
reactjs
Ben Roberts
źródło
źródło
let todos = this.props.todos.map((todo) => {return <h1>{todo.title}</h1>})
let todos = this.props.todos.map(t => <h1>{t.title}</h1>)
:)Odpowiedzi:
Pomyśl o tym, jakbyś tylko wywoływał funkcje JavaScript. Nie można użyć
for
pętli, do której trafiłyby argumenty wywołania funkcji:Zobacz, jak funkcja
tbody
jest przekazywana dofor
pętli jako argument, i oczywiście jest to błąd składniowy.Ale możesz utworzyć tablicę, a następnie przekazać ją jako argument:
Podczas pracy z JSX można używać zasadniczo tej samej struktury:
Nawiasem mówiąc, mój przykład JavaScript jest prawie dokładnie tym, na co przekształca się ten przykład JSX. Baw się z Babel REPL, aby przekonać się, jak działa JSX.
źródło
map
(np. Nie masz kolekcji przechowywanej w zmiennej).key
do każdego potomka. ODNIESIENIE: facebook.github.io/react/docs/…key
właściwość, a także styl kodu, który nie jest tak naprawdę używany w bazach kodu React. Proszę uważać tę odpowiedź stackoverflow.com/questions/22876978/loop-inside-react-jsx/… za poprawną.Nie jestem pewien, czy to zadziała w twojej sytuacji, ale często mapa jest dobrą odpowiedzią.
Jeśli to był twój kod z pętlą for:
Możesz napisać to tak z mapą :
Składnia ES6:
źródło
<tbody>{objects.map((o, i) => <ObjectRow obj={o} key={i}/>}</tbody>
używając wsparcia ES6 Reactify lub Babel.<ul> {objects.map((object:string,i:number)=>{ return <li>{object}</li> })} </ul>
za pomocą TypeScriptfor..in
this.props.order.map((k)=><ObjectRow key={k} {...this.props.items[k]} />)
Jeśli nie masz jeszcze tablicy, która
map()
polubiłaby odpowiedź @ FakeRainBrigand, i chcesz to wstawić, aby układ źródłowy odpowiadał wynikowi bliżej niż odpowiedź @ SophieAlpert:Ze składnią ES2015 (ES6) (funkcje rozkładania i strzałek)
http://plnkr.co/edit/mfqFWODVy8dKQQOkIEGV?p=preview
Re: transpilacja z Babel, jego strona z zastrzeżeniami mówi, że
Array.from
jest to wymagane do rozprzestrzeniania, ale obecnie (v5.8.23
) nie wydaje się tak w przypadku rozpowszechniania faktówArray
. Mam problem z dokumentacją, aby to wyjaśnić. Ale używaj na własne ryzyko lub wypełniacz.Vanilla ES5
Array.apply
Inline IIFE
http://plnkr.co/edit/4kQjdTzd4w69g8Suu2hT?p=preview
Połączenie technik z innych odpowiedzi
Zachowaj układ źródłowy odpowiadający wynikowi, ale spraw, aby wstawiana część była bardziej zwarta:
Ze składnią ES2015 i
Array
metodamiDzięki temu
Array.prototype.fill
możesz to zrobić jako alternatywę dla spreadu, jak pokazano powyżej:(Myślę, że faktycznie można pominąć każdy argument
fill()
, ale nie jestem w 100% tego zdania.) Dzięki @FakeRainBrigand za naprawienie mojego błędu we wcześniejszej wersjifill()
rozwiązania (zobacz wersje).key
We wszystkich przypadkach
key
attr łagodzi ostrzeżenie dzięki kompilacji programistycznej, ale nie jest dostępne u dziecka. Możesz przekazać dodatkowe attr, jeśli chcesz, aby indeks był dostępny dla dziecka. Zobacz Listy i klucze do dyskusji.źródło
yield
? Pchanie elementów do tablicy pośredniej jest trochę brzydkie, gdy mamy generatory. Czy oni pracują?[...Array(x)].map(() => <El />))
wersja, która moim zdaniem jest najbardziej elegancka i dlaczego ją przedstawiłem. Re: drugie pytanie, to świetna uwaga. Wydaje się, że nie ma w JSX nic, co by go wykluczało, więc zależy od tego, co React lub inny konsument przekształconego JSX robi z argumentami potomnymi, czego nie mogłem powiedzieć bez patrzenia na źródło. Czy wiesz? To intrygujące pytanie.fill()
. Pamiętam teraz, że powodem, dla którego się zawahałem, jest pytanie o to, jak opcjonalność parametrów jest wskazana w specyfikacji ES (trzeba to kiedyś sprawdzić). Przecinek to tylko sposób na elemen- towanie elementu tablicy - w tym przypadku pierwszego. Możesz to zrobić, jeśli chcesz, aby indeksy były od 1..długości rozkładanej tablicy, a nie od 0..długości-1 rozkładanej tablicy (ponieważ eluowane elementy tylko przyczyniają się do długości tablicy i nie dają mają odpowiednią właściwość).Wystarczy użyć metody map Array ze składnią ES6:
Nie zapomnij o
key
nieruchomości.źródło
Korzystanie z funkcji mapowania tablic jest bardzo powszechnym sposobem zapętlania tablicy elementów i tworzenia komponentów zgodnie z nimi w React , jest to świetny sposób na wykonanie pętli, która jest dość wydajnym i uporządkowanym sposobem wykonywania pętli w JSX , to nie jedyne sposób, aby to zrobić, ale preferowany sposób.
Nie zapomnij także o posiadaniu unikalnego klucza dla każdej iteracji zgodnie z wymaganiami. Funkcja mapy tworzy unikalny indeks od 0, ale nie jest zalecane używanie wygenerowanego indeksu, ale jeśli twoja wartość jest unikalna lub jeśli istnieje unikalny klucz, możesz ich użyć:
Ponadto kilka wierszy z MDN, jeśli nie znasz funkcji mapy na tablicy:
źródło
Array#map
nie jest asynchroniczne!Jeśli już używasz lodash,
_.times
funkcja jest przydatna.źródło
Możesz także wyodrębnić poza blok powrotu:
źródło
Wiem, że to stary wątek, ale możesz chcieć pobrać szablony React , które pozwalają używać szablonów w stylu jsx w reakcji, z kilkoma dyrektywami (takimi jak rt-repeat).
Twój przykład, jeśli użyjesz szablonów reagowania, to:
źródło
Można to zrobić na wiele sposobów. JSX ostatecznie zostanie skompilowany do JavaScript, więc dopóki piszesz prawidłowy JavaScript, będziesz dobry.
Moja odpowiedź ma na celu utrwalenie wszystkich cudownych sposobów, które zostały już tutaj przedstawione:
Jeśli nie masz tablicy obiektów, po prostu liczba wierszy:
w
return
bloku, tworzenieArray
i używanieArray.prototype.map
:poza
return
blokiem, po prostu użyj normalnej pętli for JavaScript:natychmiast wywołane wyrażenie funkcji:
Jeśli masz tablicę obiektów
w obrębie
return
bloku.map()
każdy obiekt do<ObjectRow>
komponentu:poza
return
blokiem, po prostu użyj normalnej pętli for JavaScript:natychmiast wywołane wyrażenie funkcji:
źródło
jeśli numrows jest tablicą i jest to bardzo proste.
Typ danych tablic w React jest bardzo lepszy, tablica może obsługiwać nową tablicę i wspierać filtrowanie, redukcję itp.
źródło
Istnieje kilka odpowiedzi wskazujących na użycie
map
instrukcji. Oto kompletny przykład, w którym iterator w składniku FeatureList wyświetla listę składników Feature na podstawie struktury danych JSON o nazwie features .Możesz wyświetlić pełny kod FeatureList na GitHub. Lista funkcji znajduje się tutaj .
źródło
Aby zapętlić się kilka razy i wrócić, możesz to zrobić za pomocą
from
imap
:gdzie
i = number of times
Jeśli chcesz przypisać unikalne identyfikatory kluczy do renderowanych komponentów, możesz użyć
React.Children.toArray
zgodnie z propozycją w dokumentacji ReactReact.Children.toArray
Zwraca nieprzezroczystą strukturę danych potomną jako płaską tablicę z kluczami przypisanymi do każdego dziecka. Przydatne, jeśli chcesz manipulować kolekcjami dzieci w swoich metodach renderowania, szczególnie jeśli chcesz zmienić kolejność lub pokroić this.props.children przed przekazaniem go.
źródło
Jeśli zdecyduje się na konwersję to wewnątrz return () z renderowanie metodę, najprostszym rozwiązaniem byłoby przy użyciu map () metody. Odwzoruj tablicę na składnię JSX za pomocą funkcji map (), jak pokazano poniżej ( używana jest składnia ES6 ).
Wewnątrz komponentu nadrzędnego :
Uwaga
key
atrybut dodany do komponentu podrzędnego. Jeśli nie podałeś kluczowego atrybutu, możesz zobaczyć następujące ostrzeżenie na konsoli.Uwaga: Jednym z powszechnych błędów popełnianych przez ludzi jest używanie
index
klucza podczas iteracji, używanieindex
elementu jako klucza jest anty-wzorcem i możesz przeczytać więcej na ten temat tutaj . Krótko mówiąc, jeśli NIE jest to statyczna lista, nigdy nie należy jej używaćindex
jako klucza.Teraz w składniku ObjectRow możesz uzyskać dostęp do obiektu z jego właściwości.
Wewnątrz komponentu ObjectRow
const { object } = this.props
lub
const object = this.props.object
Powinno to doprowadzić do obiektu przekazanego z komponentu nadrzędnego do zmiennej
object
w komponencie ObjectRow . Teraz możesz wypluć wartości w tym obiekcie zgodnie ze swoim celem.Bibliografia :
Metoda map () w JavaScript
Skrypt ECMA 6 lub ES6
źródło
powiedzmy, że mamy szereg przedmiotów w twoim stanie:
źródło
Możliwość ES2015 / Babel używa funkcji generatora do utworzenia tablicy JSX:
źródło
... Lub możesz również przygotować tablicę obiektów i odwzorować ją na funkcję, aby uzyskać pożądany wynik. Wolę to, ponieważ pomaga mi to zachować dobrą praktykę kodowania bez logiki w zwrocie renderowania.
źródło
Wystarczy użyć,
.map()
aby przejrzeć kolekcję i zwrócić<ObjectRow>
przedmioty z rekwizytami z każdej iteracji.Zakładając,
objects
że gdzieś jest tablica ...źródło
ES2015 Tablica. Od Z funkcją mapy + klawisz
Jeśli nie masz nic
.map()
, możesz użyćArray.from()
tejmap
funkcji do powtarzania elementów:źródło
Używam tego:
PS: nigdy nie zapomnij klucza, bo będziesz miał wiele ostrzeżeń!
źródło
.Id
właściwości, np.items.map( (item, index) => <Foo key={index}>{item}</Foo>
Preferuję podejście, w którym logika programowania dzieje się poza wartością zwracaną
render
. Pomaga to utrzymać to, co w rzeczywistości jest łatwe do odczytania.Więc prawdopodobnie zrobiłbym coś takiego:
Trzeba przyznać, że jest to tak niewielka ilość kodu, że wprowadzenie go może działać dobrze.
źródło
import { map } from 'lodash'
tego, abyś nie importował wszystkich funkcji lodash, jeśli ich nie potrzebujesz.map()
, tylko tablice. Właśnie to mówiłem, że lodash jest dobry do zapętlania obiektu.objects
jak na liście rzeczy, mój błąd.możesz oczywiście rozwiązać .map, jak sugeruje druga odpowiedź. Jeśli już korzystasz z Babel, możesz pomyśleć o użyciu instrukcji jsx-control. Wymagają one trochę ustawień, ale myślę, że warto je czytać (szczególnie dla niereagujących programistów). Jeśli korzystasz z lintera, istnieje również instrukcja eslint-plugin-jsx-control
źródło
Twój kod JSX skompiluje się w czysty kod JavaScript, wszelkie tagi zostaną zastąpione
ReactElement
obiektami. W JavaScript nie można wywoływać funkcji wiele razy, aby zebrać zwrócone zmienne.Jest to nielegalne, jedynym sposobem jest użycie tablicy do przechowywania zmiennych zwracanych przez funkcję.
Lub możesz użyć,
Array.prototype.map
który jest dostępny od JavaScript ES5, aby poradzić sobie z tą sytuacją.Może możemy napisać inny kompilator, aby odtworzyć nową składnię JSX w celu zaimplementowania funkcji powtarzania, takiej jak Angular
ng-repeat
.źródło
Można to zrobić na wiele sposobów.
return
zapisaniem wszystkich elementów w tablicyPętla w środku
return
Metoda 1
Metoda 2
źródło
Oto proste rozwiązanie tego problemu.
Nie jest wymagane mapowanie i złożony kod. Wystarczy wypchnąć wiersze do tablicy i zwrócić wartości, aby je wyrenderować.
źródło
Ponieważ piszesz składnię JavaScript w kodzie JSX, musisz owinąć JavaScript w nawiasy klamrowe.
źródło
Oto przykład z dokumentu React: JavaScript Expressions as Children
w twoim przypadku proponuję napisać w ten sposób:
Uwaga: Klucz jest bardzo ważny, ponieważ React używa klucza do różnicowania danych w tablicy.
źródło
Używam tego jak
źródło
Możesz zrobić coś takiego:
źródło
Świetne pytanie.
To, co robię, gdy chcę dodać określoną liczbę komponentów, to użycie funkcji pomocnika.
Zdefiniuj funkcję zwracającą JSX:
źródło
Możesz także użyć funkcji samowywołania:
źródło