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

如何使用ReactJS和Axios实现动态添加表单字段并提交POST请求

故障根因

你的代码存在3个核心错误导致仅第一个字段能提交:

  • 构造函数中重复对this.state赋值,第一次声明的状态被完全覆盖,且存储动态字段的values数组中字段名为response,和提交时用到的answer字段不匹配
  • 动态生成的输入框绑定的是全局的handlequestionChange、handleanswerNameChange方法,这两个方法只会往state中写入单个question和answer值,新增字段的输入内容根本不会被存储到values数组对应位置
  • 提交POST请求时,faqList只传入了单个固定对象,没有把存储了所有动态字段内容的values数组传入
修复后的完整代码
import React from 'react';
import axios from 'axios';
import { Grid, Button } from "@material-ui/core/";
import Alert from '@material-ui/lab/Alert';
import CloseIcon from "@material-ui/icons/Close";
import TextField from "@material-ui/core/TextField";
import AddIcon from '@material-ui/icons/Add';

class FaqPage extends React.Component<{},any>{
  constructor(props) {
    super(props)
    // 合并state声明,统一字段名
    this.state = {
      faqList:[{index: Math.random(), question:'', answer: ''}],
      questions: ['hello'],
      values: [{question: '',answer: ''}], // 把response改为answer和提交字段匹配
      errorMessage: '',
      sucessMessage: ''
    }
    this.handleSubmit = this.handleSubmit.bind(this);
    this.handleChange = this.handleChange.bind(this);
    this.addClick = this.addClick.bind(this);
    this.removeClick = this.removeClick.bind(this);
  }

  componentDidUpdate(){
    setTimeout(() => this.setState({errorMessage:''}), 40000);
    setTimeout(() => this.setState({sucessMessage:''}), 40000);
  }

  uploadDocument = (e) => {
    console.log(e); 
  }
    
  handleSubmit = event => {
    event.preventDefault();
    event.target.reset()

    axios.post('https://api.com/api/faqs',
      { 
        ipoId: '328',
        faqList: this.state.values // 直接传入所有动态字段的数组
      }
    )
    .then(res => {
      console.log(res);
      console.log(res.data);
      this.setState({sucessMessage: res.data});
    })
    .catch(err => { 
      this.setState({errorMessage: err.message});
    })
  }

  createUI(){
    return this.state.values.map((el, i) => 
        <div key={i} className="commonInput">
          <div className="formW">
            {/* 绑定带索引的handleChange,设置id为对应字段名 */}
            <TextField type="text" label="question"  id="question" onChange={(e) => this.handleChange(i,e)}/>
          </div> 
          <div className="formW">
            <TextField type="text" label="answer"  id="answer" onChange={(e) => this.handleChange(i,e)}/>
          </div> 
          {
            i ? 
              <button type="button"  className="button remove" onClick={() => this.removeClick(i)}><CloseIcon /></button> 
            : null
          }
        </div>          
    )
 }


  handleChange (i,event) {
    let values = [...this.state.values];
    values[i][event.target.id] = event.target.value;
    this.setState({ values }); 
 }
 
 addClick(){
   this.setState(prevState => ({ values: [...prevState.values, {question: '',answer: '',}]}))
 }
 
 removeClick(i){
    let values = [...this.state.values];
    values.splice(i,1);
    this.setState({ values });
 }

 componentDidMount() {
  axios.get(`https://api.com/api/get/all`)
 .then(res => {
    const posts = res.data;
    this.setState({ posts });
   })
 }

  render() {
    return (
      <Grid className="CoomonT">
        <div className="clapse ">
          <form onSubmit={this.handleSubmit}>
          <br/>
            {this.createUI()}        
            <input type='button' value='add more' onClick={this.addClick}/> 
            <div className="form-btn formW">
            <Button
              size="small"
              variant="contained"
              className=""
              color="primary"
              type="submit"
              disableElevation
            >
              Submit
            </Button>
            </div>
          </form>
        </div>
      </Grid>
    )
  }
}
export default FaqPage;
问题场景截图

问题场景截图

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 00:27:02