Я пытаюсь преобразовать компонент jQuery в React.js, и одна из проблем, с которыми я сталкиваюсь, это рендеринг n элементов на основе цикла for.
Я понимаю, что это невозможно, или рекомендуется, и что, когда в модели существует массив, имеет смысл использовать его полностью map
. Это нормально, но что делать, когда у вас нет массива? Вместо этого у вас есть числовое значение, которое соответствует заданному количеству элементов для рендеринга, тогда что вам следует делать?
Вот мой пример, я хочу добавить к элементу произвольное количество тегов span, основываясь на его иерархическом уровне. Итак, на уровне 3, я хочу 3 тега span перед текстовым элементом.
В JavaScript:
for (var i = 0; i < level; i++) {
$el.append('<span class="indent"></span>');
}
$el.append('Some text value');
Кажется, я не могу этого понять или что-то похожее на работу в компоненте JSX React.js. Вместо этого мне пришлось сделать следующее: сначала создать временный массив правильной длины, а затем зациклить массив.
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"
...
);
}
Конечно, это не может быть лучшим или единственным способом достичь этого? Чего мне не хватает?
источник
Ответы:
Обновлено: на момент реакции> 0,16
Метод рендеринга не обязательно должен возвращать один элемент. Массив также может быть возвращен.
ИЛИ
Документы здесь объясняют о детях JSX
OLD:
Вы можете использовать один цикл вместо
Вы также можете использовать .map и Fancy ES6
Кроме того, вы должны обернуть возвращаемое значение в контейнер. Я использовал div в приведенном выше примере
Как говорят здесь документы
источник
Вот более функциональный пример с некоторыми функциями ES6:
источник
import React from "react"
иexport default Articles
for loop
в массив (или объект) map'able, чтобы визуализировать n элементов в компоненте React, не имея массива элементов. Ваше решение полностью игнорирует этот факт и предполагает передачу массива статей из реквизита.Я использую
Object.keys(chars).map(...)
цикл в рендереисточник
chars && ...
и.bind(this)
в конце моей функции. Мне любопытно, почему простоObject...
(так далее и так далее) не работало. Я продолжал становиться неопределенным.Array.from()
принимает итеративный объект для преобразования в массив и дополнительную функцию карты. Вы можете создать объект со.length
свойством следующим образом:источник
Я думаю, что это самый простой способ прореагировать на JS
источник