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

ReactJS可编辑表格创建及按gameId与roundId获取输入值方法

按gameId和roundId获取表格输入框的值

我是ReactJS新手,正尝试创建如下带输入框的表格:

<table className="table table-bordered table-sm">
  <thead>
    <tr>
      <th></th>
      {gameList.map((game)=>{
        return (
          <th key={game.id}>{game.game_type}</th>
        )
      })}
    </tr>
  </thead>
  <tbody>
    {roundList.map((round)=>{
      return(
        <tr key={round.id}>
          <td>{round.game_round}</td>
          {gameList.map((game)=>{
            return (
                <td key={game.id}>
                  <input type="text"/>
                </td>
              )
            })}
        </tr>
      )
    })}
  </tbody>
</table>

表格效果:
表格效果

请问如何按照gameId和roundId分别获取所有输入框的值?


解决方案:通过受控组件绑定状态管理输入值

在React中,用受控组件+状态存储的方式,就能精准通过roundId和gameId定位每个输入框的值。

1. 初始化状态

在组件内定义一个状态,用来存储所有输入框的值,推荐用roundId-gameId的组合键作为标识,或者嵌套对象结构:

import { useState } from 'react';

// 组件内部初始化状态
const [inputValues, setInputValues] = useState({});
// 状态结构示例:{ "1-2": "用户输入值" } (1是roundId,2是gameId)

2. 给输入框绑定事件与值

修改表格中的input元素,添加value绑定和onChange事件,用round.id和game.id唯一标识当前输入框:

<td key={game.id}>
  <input 
    type="text"
    // 从状态中取对应的值,为空时显示空字符串
    value={inputValues[`${round.id}-${game.id}`] || ''}
    onChange={(e) => {
      const uniqueKey = `${round.id}-${game.id}`;
      // 更新状态,保留原有值的同时覆盖当前输入框的新值
      setInputValues(prev => ({
        ...prev,
        [uniqueKey]: e.target.value
      }));
    }}
  />
</td>

如果偏好嵌套对象的状态结构,也可以这么写:

// 初始化状态
const [inputValues, setInputValues] = useState({});

// input的onChange事件
onChange={(e) => {
  setInputValues(prev => ({
    ...prev,
    [round.id]: {
      ...prev[round.id],
      [game.id]: e.target.value
    }
  }));
}}

// input的value属性
value={inputValues[round.id]?.[game.id] || ''}

3. 按gameId/roundId提取值

需要获取指定维度的输入值时,直接从状态中提取即可:

// 获取指定roundId下的所有输入值(组合键结构)
const getRoundAllValues = (targetRoundId) => {
  return Object.entries(inputValues).reduce((result, [key, value]) => {
    if (key.startsWith(`${targetRoundId}-`)) {
      const gameId = key.split('-')[1];
      result[gameId] = value;
    }
    return result;
  }, {});
};

// 获取指定gameId下的所有输入值(组合键结构)
const getGameAllValues = (targetGameId) => {
  return Object.entries(inputValues).reduce((result, [key, value]) => {
    if (key.endsWith(`-${targetGameId}`)) {
      const roundId = key.split('-')[0];
      result[roundId] = value;
    }
    return result;
  }, {});
};

// 如果是嵌套结构,获取指定round的值更简洁
// const getRoundAllValues = (targetRoundId) => inputValues[targetRoundId] || {};

完整组件示例

整合后的完整组件代码:

import { useState } from 'react';

const GameScoreTable = ({ gameList, roundList }) => {
  const [inputValues, setInputValues] = useState({});

  return (
    <table className="table table-bordered table-sm">
      <thead>
        <tr>
          <th></th>
          {gameList.map((game) => (
            <th key={game.id}>{game.game_type}</th>
          ))}
        </tr>
      </thead>
      <tbody>
        {roundList.map((round) => (
          <tr key={round.id}>
            <td>{round.game_round}</td>
            {gameList.map((game) => {
              const inputKey = `${round.id}-${game.id}`;
              return (
                <td key={game.id}>
                  <input
                    type="text"
                    value={inputValues[inputKey] || ''}
                    onChange={(e) => {
                      setInputValues(prev => ({
                        ...prev,
                        [inputKey]: e.target.value
                      }));
                    }}
                  />
                </td>
              );
            })}
          </tr>
        ))}
      </tbody>
    </table>
  );
};

export default GameScoreTable;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 12:28:20