You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React创建含拆分行的表格时出现<tr>嵌套警告的解决求助

解决React表格嵌套警告并保留原有效果

问题原因

控制台警告validateDOMNesting(...): <tr> cannot appear as a child of <tr>是因为DOM规范不允许作为另一个的子元素,你的代码中Grandson组件的主<tr>直接嵌套了SpiltRow返回的<tr>,违反了DOM结构规则。

解决方案

通过rowspan实现跨行布局,将所有<tr>作为<tbody>的直接子元素,同时保持原有视觉效果,具体修改如下:

1. 修改SpiltRow组件

让它返回<td>而非<tr>,作为表格单元格使用:

import React from "react"
function SpiltRow({location}){
   return <td>{location.item}</td>
}
export default SpiltRow

2. 重构Grandson组件

移除嵌套的<tr>,使用rowspan让用户信息单元格跨所有location行,同时保证每行的单元格数量与表头一致:

import SpiltRow from "./SpiltRow";
function Grandson({nam })
{
  const locationCount = nam.locations.length;
  return (
    <>
      {/* 第一行:显示用户基础信息和第一个location */}
      <tr>
        <td rowSpan={locationCount}>{nam.Name}</td>
        <td rowSpan={locationCount}>{nam.age}</td> 
        <SpiltRow location={nam.locations[0]} />
        <td rowSpan={locationCount}>{(nam.adult).toString()}</td> 
      </tr>
      {/* 后续行:只显示剩余location,其他单元格留空 */}
      {nam.locations.slice(1).map((location,index)=>{
        return (
          <tr key={index}>
            <td></td>
            <td></td>
            <SpiltRow location={location} />
            <td></td>
          </tr>
        )
      })}
    </>
  )
}
export default Grandson

3. 优化Child组件

将所有用户行合并到同一个表格中,修正表头结构和key值,同时修正新用户的初始数据结构:

import Grandson from "./Grandson";
import {useState} from "react"

function Child({names ,addusers})
{
    // 修正locations的初始结构,与现有数据保持一致
    const [newUser, setNewUser] = useState({Name:"",age:"",adult:false,locations:[{item:""},{item:""}]})
    return <div> 
      <table>
        <thead>
          <tr>
            <th>name</th>
            <th>age</th>
            <th>location</th>
            <th>adult</th>
          </tr>
        </thead>
        <tbody>
          {names.map((nam,i)=>{
            // 使用数字作为key,避免对象key导致的性能问题
            return <Grandson nam={nam} key={i}/>
          })}
        </tbody>
      </table>

      first name : <input type ="text" name="Name" onChange={e =>setNewUser({... newUser,[e.target.name]:e.target.value})}/>
      city :       <input type ="text" name="age" onChange={e =>setNewUser({... newUser,[ e.target.name]:e.target.value})}/>
      adult : <input type ="checkbox"  name="adult" onChange={e =>setNewUser({... newUser,[ e.target.name]:e.target.checked})}/>
      <button onClick={()=>addusers(newUser)}> add</button>
    </div>
}
export default Child

修改后,DOM结构符合规范,控制台警告会消失,同时表格的视觉效果与原有需求一致。

内容的提问来源于stack exchange,提问作者user11721090

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 09:36:19