#javascript #reactjs
#javascript #reactjs
Вопрос:
Я пытаюсь выполнить эту работу:
Заказы:
render () {
const orders = this.state.orders.map((order, index) => <OrderRow order={order} key={index}/>);
return (
<table>
<tbody>
{orders}
</tbody>
</table>
);
}
OrderRow:
render () {
return (
<tr>
<td>{this.props.order.number}</td>
<td>{this.props.order.products}</td>
<td>{this.props.order.shippingDate}</td>
<td>{this.props.order.status}</td>
</tr>
);
}
Но все равно получаю эту ошибку:
Warning: validateDOMNesting(...): <tr> cannot appear as a child of <div>.
See Orders > div > OrderRow > tr.
Есть идеи, как это исправить?
Комментарии:
1. внутри таблицы
div
у вас не может быть промежуточного элемента между любым из этихtable
,thead
,tbody
,tr
,td
. однако вы можете иметь div внутриtd
убедитесь, что ваш HTML следует этому.2. Но где это
<div>
внутри моего кода??3. Об этом говорится в сообщении об ошибке. И даже я не вижу возможного div в приведенном выше коде. Если это полный код, то это странно.
4. Не отображается, когда я делаю это в этой скрипке: jsfiddle.net/v9whLm5w/1
5. Нет, это работает…
Ответ №1:
OrderRow
<tr>
<tbody>
Как описано в вопросе здесь, браузеры нуждаются в <tbody>
теге. Если его нет в вашем коде, браузер автоматически вставит его. Это будет нормально работать при первом рендеринге, но когда таблица обновляется, дерево DOM отличается от того, что ожидает React . Это может привести к странным ошибкам, поэтому React предупреждает вас о необходимости вставить <tbody>
.
OrderRow
render () {
return (
<table>
<tbody>
<tr>
<td>{this.props.order.number}</td>
<td>{this.props.order.products}</td>
<td>{this.props.order.shippingDate}</td>
<td>{this.props.order.status}</td>
</tr>
</tbody>
</table>
);
}
Комментарии:
1. он оборачивает свой tr в tbody . это не отвечает на вопрос.
Ответ №2:
Что-то вроде этого:
render() {
return (
<table>
<tbody>
{this.state.orders.map((order, index) => {
<tr index={index}>
<td>{order.number}</td>
<td>{order.products}</td>
<td>{order.shippingDate}</td>
<td>{order.status}</td>
</tr>
})}
</tbody>
</table>
);
}
Ответ №3:
Или более элегантный:
render () {
return (
<table>
<tbody>
{this.state.orders.map((order, index) => (
return (<OrderRow order={order} key={index} />);
)}
</tbody>
</table>
);
}
Комментарии:
1. Похоже, что во всем виноват webpack-dev-server, при сборке с помощью простой команды webpack все работает так, как ожидалось.
Ответ №4:
Он отображается tr
в div
, поэтому используйте .map()
вместо этого 🙂
Комментарии:
1. Похоже, что во всем виноват webpack-dev-server, при сборке с помощью простой команды webpack все работает так, как ожидалось.
Ответ №5:
Не могли бы вы попробовать что-то более автоматическое?
render() {
return (
<table>
<tbody>
{this.state.orders.map((order, index) => {
<tr index={index}>
{Object.keys(order).map(function(key,id) {
return (<td key={id}>{order[key]}</td>)
})}
</tr>
}}
</tbody>
</table>
);
}