React.js多次渲染Question组件时内部嵌套div无法渲染
问题原因
多次渲染同个Question组件时嵌套div无法正常渲染,和div嵌套结构本身无关,核心诱因有两个:
- 组件内所有MUI TextField都写了硬编码的固定id,同页面渲染多个组件实例时会出现大量重复id,违反HTML中id必须全局唯一的规范,直接导致MUI内部的DOM关联、样式注入逻辑错乱,连带嵌套div渲染异常
- 给出的代码中未体现
TextField、Stack两个MUI组件的引入语句,如果漏引入对应组件,React解析组件树时会中断,直接导致后续嵌套结构无法正常渲染
修复步骤
- 首先确认文件顶部正确引入所有依赖的MUI组件和React方法:
import { TextField, Stack } from '@mui/material'; // 引入React 18+内置的useId钩子生成唯一id import { useId } from 'react';
- 删掉所有硬编码的固定id,用
useId为每个组件实例生成唯一的id前缀,拼接得到全局唯一的元素id,从根源避免多实例id冲突 - 检查
.question-box类对应的CSS规则,确认没有设置会截断/隐藏子元素的属性,比如过小的固定高度搭配overflow: hidden、错误的display: none规则等
修复后的完整组件代码:
const Question = () => { const uid = useId(); return ( <div className="question-box"> <TextField fullWidth label="Enter Question!" id={`${uid}-question-input`} multiline minRows={2} maxRows={10} color="success" /> <div> <Stack spacing={2}> <TextField id={`${uid}-opt-1`} label="Option1" variant="filled" /> <TextField id={`${uid}-opt-2`} label="Option2" variant="filled" /> <TextField id={`${uid}-opt-3`} label="Option3" variant="filled" /> <TextField id={`${uid}-opt-4`} label="Option4" variant="filled" /> </Stack> </div> <div> <Stack direction="row" spacing={10}> <TextField id={`${uid}-time`} label="Time(sec)" type="number" InputProps={{ inputProps: { max: 50, min: 20, }, }} /> <TextField id={`${uid}-correct-opt`} label="Correct-Option" type="number" /> </Stack> </div> </div> ); }; export default Question;
排查提示
如果修复后仍有异常,直接打开浏览器开发者工具的Console面板,优先处理红色报错:
- 出现
Duplicate id类报错:继续排查页面内其他硬编码id的元素 - 出现
is not defined类报错:对应组件/变量未正确引入 - 无报错但渲染异常:在Elements面板选中异常位置的div,检查Computed样式是否有异常的隐藏、宽高为0的规则
内容的提问来源于stack exchange,提问作者Dharma Reddy
相关产品推荐
相关产品推荐

