Próbuję przekonwertować składnik jQuery do React.js i jedną z rzeczy, z którymi mam problem, jest renderowanie n liczby elementów w oparciu o pętlę for.
Rozumiem, że nie jest to możliwe lub zalecane, a jeśli w modelu istnieje tablica, jej użycie ma sens map
. W porządku, ale co, jeśli nie masz tablicy? Zamiast tego masz wartość liczbową, która jest równa określonej liczbie elementów do renderowania, więc co powinieneś zrobić?
Oto mój przykład, chcę poprzedzić element dowolną liczbą tagów span w oparciu o jego poziom hierarchiczny. Tak więc na poziomie 3 chcę 3 znaczniki span przed elementem tekstowym.
W javascript:
for (var i = 0; i < level; i++) {
$el.append('<span class="indent"></span>');
}
$el.append('Some text value');
Nie mogę uzyskać tego ani niczego podobnego do pracy w komponencie JSX React.js. Zamiast tego musiałem wykonać następujące czynności, najpierw zbudować tablicę tymczasową o odpowiedniej długości, a następnie zapętlić tablicę.
React.js
render: function() {
var tmp = [];
for (var i = 0; i < this.props.level; i++) {
tmp.push(i);
}
var indents = tmp.map(function (i) {
return (
<span className='indent'></span>
);
});
return (
...
{indents}
"Some text value"
...
);
}
Z pewnością nie może to być najlepszy lub jedyny sposób na osiągnięcie tego? czego mi brakuje?
źródło
Odpowiedzi:
Zaktualizowano: od React> 0.16
Metoda Render niekoniecznie musi zwracać pojedynczy element. Można również zwrócić tablicę.
LUB
Dokumenty wyjaśniające dzieci JSX
STARY:
Zamiast tego możesz użyć jednej pętli
Możesz także użyć .map i fantazyjnego es6
Musisz także opakować zwracaną wartość w kontenerze. W powyższym przykładzie użyłem div
Jak mówią tutaj doktorzy
źródło
Oto bardziej funkcjonalny przykład z niektórymi funkcjami ES6:
źródło
import React from "react"
iexport default Articles
for loop
na tablicę (lub obiekt) możliwą do mapowania, aby wyrenderować liczbę n elementów w komponencie React bez posiadania tablicy elementów. Twoje rozwiązanie całkowicie ignoruje ten fakt i zakłada przekazanie szeregu artykułów z rekwizytów.Używam
Object.keys(chars).map(...)
do zapętlenia w renderowaniuźródło
chars && ...
i.bind(this)
na końcu mojej funkcji. Jestem ciekawy, dlaczego po prostuObject...
(tak dalej i tak dalej) nie zadziałało. Ciągle byłem niezdefiniowany.Array.from()
pobiera iterowalny obiekt do konwersji na tablicę i opcjonalną funkcję mapy. Możesz utworzyć obiekt z.length
właściwością w następujący sposób:źródło
Myślę, że jest to najłatwiejszy sposób na zapętlenie reakcji js
źródło