У меня есть один компонент, который будет отображать массив строк. Код выглядит так.
React.createClass({
render() {
<div>
this.props.data.map(t => <span>t</span>)
</div>
}
})
Он работает отлично. то есть, если props.data = ['tom', 'jason', 'chris'] Отображаемый результат на странице будет tomjasonchris
Затем я хочу объединить все имена с помощью запятой, поэтому я меняю код на
this.props.data.map(t => <span>t</span>).join(', ')
Однако результат рендеринга - [Объект], [Объект], [Объект].
Я не знаю, как интерпретировать объект, чтобы он стал реагирующим компонентом для визуализации. Любое предложение ?
If the array is empty and no initialValue was provided, TypeError would be thrown.
. поэтому это не сработает для пустого массива.prev
массив. например[1, 2, 3, 4]
становится[[[1,",",2],",",3],",",4]
..reduce((prev: JSX.Element, current: JSX.Element): any => [prev, (<span> </span>), current])
Вы можете использовать
reduce
для объединения нескольких элементов массива:Это инициализирует аккумулятор нулевым значением, поэтому мы можем обернуть первый элемент в массиве. Для каждого следующего элемента в массиве мы создаем новый массив, содержащий все предыдущие элементы, используя
...-operator
, добавляем разделитель, а затем следующий элемент.Array.prototype.reduce ()
источник
['a'].reduce((a, e) => [...a, ',', e],[])
урожайность[",", "a"]
. Отсутствие инициализатора работает, если массив не пуст, и в этом случае возвращается ошибка TypeError.Обновление с помощью React 16: теперь можно напрямую отображать строки, поэтому вы можете упростить свой код, удалив все бесполезные
<span>
теги.источник
Принятый ответ фактически возвращает массив массивов , так как
prev
будет массив каждый раз. React достаточно умен, чтобы заставить эту работу работать, но может ли он вызвать проблемы в будущем, такие как нарушение алгоритма различения Reacts при предоставлении ключей для каждого результата карты.Новая
React.Fragment
функция позволяет нам делать это простым для понимания способом, без основных проблем.С помощью
React.Fragment
мы можем просто поместить разделитель,
вне возвращаемого HTML, и React не будет жаловаться.источник
<span>{t}</span>
вы возвращаете является объектом, а не строка. Проверьте ответные документы об этом https://facebook.github.io/react/docs/jsx-in-depth.html#the-transformИспользуя
.join()
в возвращаемом массиве изmap
, вы присоединяетесь к массиву объектов.[object Object], ...
Вы можете поместить запятую внутри,
<span></span>
чтобы он отображался так, как вы хотите.образец: https://jsbin.com/xomopahalo/edit?html,js,output
источник
Мой вариант:
источник
Если я просто хочу отобразить массив компонентов, разделенных запятыми, я обычно нахожу
reduce
слишком подробным. Более короткое решение в таких случаях:{index > 0 && ', '}
отобразит запятую с последующим пробелом перед всеми элементами массива, кроме первого.Если вы хотите разделить предпоследний элемент и последний чем-то другим, скажем, строкой
' and '
, вы можете заменить{index > 0 && ', '}
наисточник
Используя es6, вы можете сделать что-то вроде:
А затем запустите:
источник
Используйте вложенный массив, чтобы сохранить "," снаружи.
Оптимизируйте его, сохранив данные в массиве и изменив последний элемент, вместо того, чтобы постоянно проверять, был ли его последний элемент.
источник
Это сработало для меня:
источник
Как упоминал Пит , React 16 позволяет вам использовать строки напрямую, поэтому упаковка строк в теги span больше не нужна. Основываясь на ответе Маартена , если вы также хотите сразу же обработать настраиваемое сообщение (и не выдавать ошибку в пустом массиве), вы можете выполнить операцию с помощью тернарного оператора if для свойства length в массиве. Это может выглядеть примерно так:
источник
Это должно вернуть плоский массив. Обработка случая с не повторяемым первым объектом путем предоставления начального пустого массива и фильтрации ненужной первой запятой из результата
источник
Неужели я единственный, кто думает, что здесь в ответах происходит много ненужного распространения и вложения? Конечно, баллы за краткость, но это оставляет дверь открытой для проблем масштабирования или изменения React, как они работают с вложенными массивами / фрагментами.
Один массив, без вложенности. Никакого соблазнительного связывания методов тоже нет, но если вы обнаружите, что делаете это часто, вы всегда можете добавить его в прототип массива или обернуть его функцией, которая также принимает обратный вызов сопоставления, чтобы сделать все это за один раз.
источник
источник