Pouvez-vous m'expliquer pourquoi réagir show warning warning Warning: validateDOMNesting(...): #text cannot appear as a child of <tr>. See Router > RouterContext > CarWashPage > AllCarWashTable > tr > #text.
? Je ne vois pas de texte dans la balise tr
Code qui rend la table
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>
)
}
}
A la fin, my table a la structure suivante
Où est le problème?
Le problème est les espaces dans cette ligne:
return <tr key={item.id}> {cells} </tr>;
Cela peut sembler idiot, mais vous rendez en fait les cellules et quelques espaces blancs (c'est-à-dire du texte). Ça devrait ressembler à ça:
return <tr key={item.id}>{cells}</tr>;
La réponse acceptée n'était pas la cause fondamentale dans mon cas. J'ai eu le même avertissement quand j'avais un commentaire après la balise <th>
. L'avertissement a disparu quand j'ai enlevé le commentaire.
const TableHeaders = (props) => (
<tr>
<th>ID</th> {/* TODO: I had a comment like this */}
</tr>
)
EDIT: Supprimer l’espace entre </th>
et {/*
fera également l'affaire.
Dans mon cas, où était une sortie ''
vide (sans espace à l'intérieur)
<tbody>
{this.props.orders.map(
order =>this.props.selectedAgent === order.agent ?
<Row item={order} key={ order._id } /> : ''
)
}
</tbody>
Le null fait le tour:
<tbody>
{this.props.orders.map(
order =>this.props.selectedAgent === order.agent ?
<Row item={order} key={ order._id } /> : null
)
}
</tbody>
Cela se produit également lors de l'utilisation de l'opérateur AND (logique) AND court-circuit &&
pour afficher/masquer les lignes conditionnelles
{
foo && (<tr><td>{foo}</td></tr>)
}
changez-le en forme ternaire a ? b : c
où c est null
résoudra le problème
{
foo ? (<tr><td>{foo}</td></tr>) : null
}
Avertissement de notification: validateDOMNesting(...): Whitespace text nodes cannot appear as a child of <tbody>
. Assurez-vous de ne pas laisser d'espace blanc supplémentaire entre les balises sur chaque ligne de votre code source . Dans mon cas, la variable d'initialisation ne devrait PAS être 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>
)
Solution: let elementCart = null;
J'ai reçu cet avertissement quand j'avais une parenthèse au lieu d'une accolade
<table>
<tbody>
<tr>
(showMsg && <td>Hi</td>} // leading '(' should be a '{'
</td>
</tbody>
</table>
En plus de la réponse de @ Jarno, j'ai également rencontré ce problème. Vérifiez à nouveau que vous n'avez pas plus de }
ou {
à la fin de votre code javascript:
{this.props.headers.map(header => <th key={header}>{header}</th>)}}
↑
Si quelqu'un d'autre rencontrait cette erreur ou une erreur d'espacement similaire avec Material UI dans React, ma solution après des heures de rupture de code était un simple commentaire javascript dans mon tableau.
{ /* sortable here */ }
J'ai enlevé ça entre mes éléments de table et l'avertissement a disparu.