You need to enable JavaScript to run this app. React Material UI 表格实现每行单个下拉框整合所有键值对选项
优惠活动
大模型
产品
解决方案
定价
更多

React Material UI 表格实现每行单个下拉框整合所有键值对选项

问题根因

原代码在渲染表格行时,每遍历到一个非name的对象属性,就会独立渲染一个包裹下拉框的TableCell。这种逻辑会让表格列数随每行属性数量动态变化,出现多余的独立单元格,和表头定义的两列结构错位。

实现思路

要达成“每行仅配置一个下拉选择框,所有非name的键值对都作为该下拉框的选项”的目标,需要调整遍历的作用范围:

  • 每行固定渲染两个单元格,对应表头的两列结构,不再按属性数量生成额外单元格
  • 在“Object Field and Values”对应的单元格内部,遍历当前行的非name属性,将每个键值对生成为下拉框的选项
  • 补充下拉框的受控状态逻辑,保证选中值可以正常存储
修正参考代码

首先在组件内部添加受控状态定义,用于存储每一行的下拉选中值:

// 结构:{ 行对象的name属性: 当前选中的选项值 }
const [selectedRowOptions, setSelectedRowOptions] = useState({});

表格渲染部分调整为:

<TableContainer component={Paper}>
  <Table className={classes.table} aria-label="simple table">
    <TableHead>
      <TableRow>
        <TableCell>Object Name</TableCell>
        <TableCell align="center">Object Field and Values</TableCell>
      </TableRow>
    </TableHead>
    <TableBody>
      {unionArray?.map((row) => {
        // 过滤出当前行所有非name属性,作为下拉选项的数据源
        const optionList = Object.entries(row).filter(([key]) => key !== "name");
        // 读取当前行的选中值,无选中时默认空值
        const currentSelected = selectedRowOptions[row.name] ?? "";

        return (
          <TableRow key={row.name}>
            <TableCell component="th" scope="row">
              {row.name}
            </TableCell>
            {/* 固定渲染一个对应列的单元格 */}
            <TableCell align="center">
              <FormControl variant="outlined" className={classes.formControl}>
                {/* 每行下拉使用独立id,解决InputLabel与Select的关联错位问题 */}
                <InputLabel htmlFor={`values-select-${row.name}`}>
                  Values
                </InputLabel>
                <Select
                  native
                  label="Value"
                  id={`values-select-${row.name}`}
                  value={currentSelected}
                  onChange={(e) => {
                    setSelectedRowOptions(prev => ({
                      ...prev,
                      [row.name]: e.target.value
                    }))
                  }}
                >
                  <option aria-label="None" value="" />
                  {/* 遍历生成下拉选项,不额外生成单元格 */}
                  {optionList.map(([key, value]) => (
                    <option key={key} value={`${key}:${value}`}>
                      {key}:{value}
                    </option>
                  ))}
                </Select>
              </FormControl>
            </TableCell>
          </TableRow>
        )
      })}
    </TableBody>
  </Table>
</TableContainer>
效果说明

调整后表格会严格匹配表头的两列布局,每一行的字段列仅展示一个下拉选择框,所有属于当前行的非name属性键值对,都会作为选项收纳在这个选择框内部,不会再出现按属性数拆分的多余单元格。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.11.05 11:54:02