Одна линия отлично работает
render: function () {
return (
{[1,2,3].map(function (n) {
return <p>{n}</p>
}}
);
}
не для нескольких строк
render: function () {
return (
{[1,2,3].map(function (n) {
return (
<h3>Item {n}</h3>
<p>Description {n}</p>
)
}}
);
}
Спасибо.
return ("asdf" "asdf");
вы хотитеreturn ["asdf", "asdf"];
Ответы:
Попробуйте представить теги как вызовы функций (см. Документацию ). Тогда первый становится:
И второй:
Теперь должно быть ясно, что второй фрагмент на самом деле не имеет смысла (вы не можете вернуть более одного значения в JS). Вам нужно либо обернуть его в другой элемент (скорее всего, то, что вы хотите, таким образом вы также можете предоставить допустимое
key
свойство), либо вы можете использовать что-то вроде этого:С сахаром JSX:
Вам не нужно сглаживать полученный массив, React сделает это за вас. См. Следующую скрипку http://jsfiddle.net/mEB2V/1/ . Опять же: объединение двух элементов в div / section, скорее всего, будет лучше в долгосрочной перспективе.
источник
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>
. Ноrender
функция компонента не может вернуть этот массив, не обернув его, например, в div.Похоже, старый ответ о возврате массива больше не применяется (возможно, с React ~ 0.9, как написал @ dogmatic69 в комментарии ).
В документах говорится, что вам нужно вернуть один узел:
Во многих случаях вы можете просто заключить вещи в a
<div>
или a<span>
.В моем случае я хотел вернуть несколько
<tr>
s. Я завернул их в<tbody>
- стол может иметь несколько тел.РЕДАКТИРОВАТЬ: Начиная с React 16.0, возвращение массива, по-видимому, снова разрешено, если каждый элемент имеет
key
: https://facebook.github.io/react/blog/2017/09/26/react-v16.0.html # new-render-return-types-fragments-and-stringsРЕДАКТИРОВАТЬ: React 16.2 позволяет окружать список элементов
<Fragment>…</Fragment>
или даже<>…</>
, если вы предпочитаете это массивом: https://blog.jmes.tech/react-fragment-and-semantic-html/источник
<li>
? Предполагая, что я не могу просто обернуть все это<ul>
<li><ul><li>one</li><li>two</li></ul></li>
, что работает в вашей ситуации. Или: обертывающий div не будет строго допустимым, но, возможно, он отлично отображается во всех соответствующих браузерах? Если попробуете, дайте нам знать.li
в aspan
илиdiv
не сработало для меня. Div серьезно нарушил рендеринг, и, по крайней мере, в моем случае использования span испортил CSS. 2 ¢: Попытка вернуть несколько подмножествli
s - это запах кода. Мы использовали aul
как своего рода выпадающее меню, и я изначально хотел, чтобы многие компоненты возвращали «разделы»li
s. В конце концов, было лучше поместить весь код меню в один компонент, «привязанный» к нему,ul
чем вставлять элементыli
из нескольких источников. Я думаю, что это также сделало ментальную модель пользовательского интерфейса немного чище.Начиная с React v16.0.0 и далее, можно возвращать несколько элементов, заключая их в
Array
Также в React v16.2.0 представлена новая функция,
React Fragments
которую вы можете использовать для переноса нескольких элементов.Согласно документации:
источник
Кроме того, вы можете захотеть вернуть несколько элементов списка в некоторой вспомогательной функции внутри компонента React. Просто верните массив узлов html с
key
атрибутом:источник
Вы можете использовать
createFragment
здесь.https://facebook.github.io/react/docs/create-fragment.html
(здесь используется синтаксис ES6 и JSX)
вам сначала нужно добавить
react-addons-create-fragment
пакет:Преимущество перед решением Яна Олафа Кремса: React не жалуется на отсутствие
key
источник
Обновлено
Используйте React Fragment. Это просто. Ссылка на фрагмент документации.
Старый ответ - устаревший
С React> 16 вы можете использовать react-Composite .
Конечно, необходимо установить реакт-композит.
источник
Это просто по фрагменту React
<></>
иReact.Fragment
:источник