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

如何获取React中动态添加的输入元素的值?

解决动态添加输入框并获取所有数值的问题

你当前代码的核心问题是把JSX元素存在useState里,这是React的反模式。正确的思路是数据驱动视图:用state存储输入框的业务数据,而非渲染好的UI元素,这样获取所有数值会变得非常直观。

下面是修正后的完整实现:

import { useState } from 'react';

function ExpenseForm() {
  // 用数组存储每个费用项的数据,每个项包含描述和金额字段
  const [addedExpenses, setAddedExpenses] = useState([]);

  // 添加新的空费用项
  function addExpense() {
    setAddedExpenses(prevState => [...prevState, { description: '', amount: '' }]);
  }

  // 更新指定索引的费用项数据
  function handleInputChange(index, field, value) {
    setAddedExpenses(prevState => {
      const updatedExpenses = [...prevState];
      // 复制原对象并更新指定字段
      updatedExpenses[index] = { ...updatedExpenses[index], [field]: value };
      return updatedExpenses;
    });
  }

  // 获取所有输入的数值示例
  function getAllExpenseValues() {
    // 直接从state读取所有数据,已经和输入框同步
    console.log('所有费用数据:', addedExpenses);
    
    // 可选:过滤空值并将金额转为数字类型
    const validExpenses = addedExpenses
      .filter(item => item.description.trim() && item.amount.trim())
      .map(item => ({
        ...item,
        amount: Number(item.amount)
      }));
    console.log('格式化后的有效费用:', validExpenses);
  }

  return (
    <div>
      <button onClick={addExpense}>添加费用项</button>
      
      {/* 遍历state数据,动态渲染输入框 */}
      {addedExpenses.map((expense, index) => (
        <div key={index} className="new-expense">
          <input
            type="text"
            placeholder="费用描述"
            value={expense.description}
            onChange={(e) => handleInputChange(index, 'description', e.target.value)}
          />
          <input
            type="number"
            placeholder="金额"
            value={expense.amount}
            onChange={(e) => handleInputChange(index, 'amount', e.target.value)}
          />
        </div>
      ))}

      <button onClick={getAllExpenseValues}>获取所有数值</button>
    </div>
  );
}

export default ExpenseForm;

关键说明

  • state存数据而非UI:addedExpenses存储的是纯数据对象,React根据这些数据渲染对应的输入框,这是React的核心设计思路。
  • 受控组件:每个输入框都是受控组件,value绑定state对应字段,onChange触发state更新,保证输入框内容和state完全同步。
  • 唯一key:遍历渲染元素时必须添加key,这里用索引是因为场景简单;如果有后端返回的唯一ID,优先用ID作为key。
  • 获取数值:需要读取所有输入值时,直接访问addedExpenses即可,它已经包含了所有输入框的最新内容,还能按需做过滤、类型转换等处理。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 00:53:11