你能解释一下为什么反应显示警告Warning: validateDOMNesting(...): #text cannot appear as a child of <tr>. See Router > RouterContext > CarWashPage > AllCarWashTable > tr > #text.
?我在标记tr
呈现表格的代码
export default class AllCarWashTable extends React.Component{
constructor(props) {
super(props);
this.generateHeaders = this.generateHeaders.bind(this);
this.generateRows = this.generateRows.bind(this);
};
static propTypes = {
cols : React.PropTypes.array.isRequired,
rows : React.PropTypes.array.isRequired
}
generateHeaders() {
let cols = this.props.cols; // [{key, label}]
return cols.map(function(colData) {
return <th key={colData.key}> {colData.label} </th>;
});
}
generateRows() {
let cols = this.props.cols, // [{key, label}]
data = this.props.rows;
if (this.props.rows.length > 0) {
return data.map(function(item) {
var cells = cols.map(function(colData) {
return <td key={colData.key}> {item[colData.key]} </td>;
});
return <tr key={item.id}> {cells} </tr>;
});
}
}
render(){
let headers = this.generateHeaders();
let rows = this.generateRows();
return (
<table className="table table-hove">
<thead>
<tr>
{headers}
</tr>
</thead>
<tbody>
{rows}
</tbody>
</table>
)
}
}
最后,我的表格具有以下结构
问题出在哪里?
答案 0 :(得分:27)
问题是这一行中的空格:
return <tr key={item.id}> {cells} </tr>;
看起来很愚蠢,但你实际上是在渲染单元格和一些空格(即文字)。它应该是这样的:
return <tr key={item.id}>{cells}</tr>;
答案 1 :(得分:8)
在我的情况下,空的''
输出(内部空间)
<tbody>
{this.props.orders.map(
order =>this.props.selectedAgent === order.agent ?
<Row item={order} key={ order._id } /> : ''
)
}
</tbody>
null 可以解决问题:
<tbody>
{this.props.orders.map(
order =>this.props.selectedAgent === order.agent ?
<Row item={order} key={ order._id } /> : null
)
}
</tbody>
答案 2 :(得分:6)
当使用逻辑AND短路&&
显示/隐藏条件行时,也会发生这种情况:
{
foo && (<tr><td>{foo}</td></tr>)
}
将其更改为三元a ? b : c
形式,其中c为null
即可解决
{
foo ? (<tr><td>{foo}</td></tr>) : null
}
答案 3 :(得分:4)
接受的答案不是我案件的根本原因。当我在const TableHeaders = (props) => (
<tr>
<th>ID</th> {/* TODO: I had a comment like this */}
</tr>
)
标记后发表评论时,我收到了同样的警告。当我删除评论时,警告就消失了。
</th>
编辑:删除{/*
和{{1}}之间的空格也可以解决问题。
答案 4 :(得分:4)
<tr>
HTML标记表示表格行。因此,要在表格行中显示的任何文本都必须置于<td>
HTML标记内。这样可以消除错误。
示例:
return (
<tr>
<td> {/* Using <td> inside <tr> */}
Hello World!
</td>
</tr>
);
答案 5 :(得分:2)
答案 6 :(得分:1)
通知警告:validateDOMNesting(...): Whitespace text nodes cannot appear as a child of <tbody>
。确保源代码的每一行上的标签之间没有任何额外的空白区域。
在我的例子中,initialize变量不应该是null
。
let elementCart = ''; {/* in the here,warning will append */}
if(productsCart.length > 0){
elementCart = productsCart.map((item, index) => {
return <CartItem item={item} key={index} index={index} />
});
}
return(
<tbody id="my-cart-body">
{elementCart}
</tbody>
)
解决方案:let elementCart = null;
答案 7 :(得分:1)
在我的情况下,使用null而不是“”初始化变量可以正常工作
答案 8 :(得分:1)
确保对let
变量赋值,否则初始化一个新的空数组。
{headers ? headers : []}
or
{rows || []}
对我来说,它就像一种魅力...
render(){
let headers = this.generateHeaders();
let rows = this.generateRows();
return (
<table className="table table-hove">
<thead>
<tr>
{headers ? headers : []}
</tr>
</thead>
<tbody>
{rows || []}
</tbody>
</table>
)
}
|| null
也可以解决。
重要的是该值不是''
答案 9 :(得分:0)
除了@Jarno的回答,我也遇到了这个问题。仔细检查您的JavaScript代码末尾是否还有其他}
或{
:
{this.props.headers.map(header => <th key={header}>{header}</th>)}}
↑
答案 10 :(得分:0)
当我有一个括号而不是一个大括号
时,我收到了这个警告<table>
<tbody>
<tr>
(showMsg && <td>Hi</td>} // leading '(' should be a '{'
</td>
</tbody>
</table>
答案 11 :(得分:0)
如果其他人在React中的Material UI中遇到此错误或类似的空格错误,则在破坏代码数小时后,我的解决方案是在表中添加一个简单的javascript注释。
{ /* sortable here */ }
我从表格元素之间删除了该内容,警告消失了。
答案 12 :(得分:0)
将文本放在<tr>
元素中而没有<td>
元素时,收到此警告。我用<td>
元素包裹了文字,警告消失了。
当我这样做时,在文本中使用空格或使用{}都没有关系。
答案 13 :(得分:0)
在我的情况下,我确实在<tr>
中有一个<tr>
(打算使用<td>
):)
答案 14 :(得分:0)
答案 15 :(得分:0)
Kevin Law(来自其他评论)说,您可以这样做:
{
foo ? (<tr><td>{foo}</td></tr>) : null
}
但是您也可以像这样修复它:
{
Boolean(foo) && <tr><td>{foo}</td></tr>
}