Как я могу визуализировать одноуровневые элементы без обертывания их в родительский тег?
в большинстве случаев наличие родительского тега не является проблемой.
React.createClass({
render: function() {
return (
<tbody>
<tr><td>Item 1</td></tr>
<tr><td>Item 2</td></tr>
</tbody>
);
}
});
но есть некоторые случаи, когда имеет смысл элементов в функции render без родителей, и особенно в случае таблицы, вы не хотите, чтобы обернуть строку таблицы в div
.
React.createClass({
render: function() {
return (
<tr><td>Item 1</td></tr>
<tr><td>Item 2</td></tr>
);
}
});
второй пример дает следующую ошибку:Adjacent XJS elements must be wrapped in an enclosing tag while parsing file
.
как я могу визуализировать два родственных элемента, не оборачивая их в <div>
или что-то подобное?
7 ответов:
это ограничение в настоящее время, но, вероятно, будет исправлено в какой-то момент в будущем (есть некоторые открытые вопросы по РЕПО github).
на данный момент Вы можете использовать функцию, которая возвращает массив (это в основном компонент без состояния):
function things(arg, onWhatever){ return [ <tr><td>Item 1</td></tr>, <tr><td>Item 2</td></tr> ]; }
и используйте это в своем компоненте.
return ( <table><tbody> {things(arg1, this.handleWhatever)} {things(arg2, this.handleWhatever)} </tbody></table> );
обновление
в React 16 вы сможете вернуть массив из render.
Я знаю, что это был старый пост, но, возможно, мой ответ может помочь новичкам, таким как я.
в React 16.2, улучшена поддержка фрагментов.
теперь вы можете вернуть ее так:
return ( <> <tr><td>Item 1</td></tr> <tr><td>Item 2</td></tr> </> );
вы можете обернуть его с
<></>
или<Fragment></Fragment>
.если вы хотите передать некоторые атрибуты, только ключ поддерживается на момент написания статьи, и вам придется использовать
<Fragment />
так как короткий синтаксис<></>
не принимает атрибуты.Примечание: Если вы собираетесь использовать короткий синтаксис убедитесь, что вы используете Вавилон 7.
Ура! Команда React наконец-то добавила эту функцию. Начиная с React v16. 0, вы можете сделать:
render() { // No need to wrap list items in an extra element! return [ // Don't forget the keys :) <tr key="a"><td>Item 1</td></tr>, <tr key="b"><td>Item 2</td></tr> ]; }
посмотреть полный пост в блоге, объясняющий "новые типы возврата рендеринга: фрагменты и строки" здесь.
вы можете обернуть его в квадратные скобки, например:
React.createClass({ render: function() { return ( [ <tr><td>Item 1</td></tr> <tr><td>Item 2</td></tr> ] ); } });
этот пример хорошо работает для меня:
let values = []; if (props.Values){ values = [ <tr key={1}> <td>props.Values[0].SomeValue</td> </tr> , <tr key={2}> <td>props.Values[1].SomeValue</td> </tr> ]; } return ( <table className="no-border-table table"> <tbody> <tr> <th>Some text</th> </tr> {values} </tbody> </table> )