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

React+Redux表单提交问题:表单数据显示undefined无法提交

解决表单数据undefined及Redux提交问题

我帮你梳理下代码里的几个关键问题,一步步来修复:

你遇到的表单数据全是undefined的核心原因是PostForm组件丢失了本地状态管理,再加上组件回调传递、Redux逻辑的几处不匹配,导致输入数据根本没被正确捕获和传递。


1. 恢复PostForm的本地表单状态

你把PostForm里的state和onChange方法注释掉了,这就导致输入框绑定的this.props.title/body根本不存在,自然是undefined。我们需要让组件自己管理输入状态:

修改PostForm.js:

import React, { Component } from 'react';
import PropTypes from 'prop-types';

class PostForm extends Component {
  // 恢复表单状态,存储输入值
  state = {
    title: '',
    body: '',
  };

  static propTypes = {
    sendPostData: PropTypes.func.isRequired,
  };

  // 恢复输入变更处理方法
  onChange = e => {
    this.setState({
      [e.target.name]: e.target.value,
    });
  };

  onSubmit(e) {
    e.preventDefault();
    // 从本地state获取表单数据
    const { title, body } = this.state;
    console.log('捕获的表单数据:', title, body);
    // 把数据传给Redux action
    this.props.sendPostData({ title, body });
    // 可选:提交后清空表单
    this.setState({ title: '', body: '' });
  }

  render() {
    const { title, body } = this.state; // 从本地state拿值,不是props
    return (
      <div>
        <h1> Add Post </h1>
        <form onSubmit={e => this.onSubmit(e)}>
          <div>
            <label>Title: </label>
            <input type='text' name='title' value={title} onChange={this.onChange} />
          </div>
          <div>
            <label>Body: </label>
            <textarea name='body' value={body} onChange={this.onChange} />
          </div>
          <button type='submit'>Submit</button>
        </form>
      </div>
    );
  }
}

export default PostForm;

2. 修正Post组件的无效回调传递

你在Post组件里注释掉了onSubmit方法,还给PostForm传了无效的addPost={this.onSubmit},这部分完全不需要——提交逻辑已经交给Redux处理了,直接渲染PostForm即可:

修改Post.js的render方法:

render() {
  console.log('props', this.props);
  const { posts } = this.props;
  return (
    <div>
      <PostForm />
      <br />
      {posts.length > 0 && (
        <div>
          {posts.map(post => (
            <div key={post.id}>
              <h3>{post.title}</h3>
              <p>{post.body}</p>
            </div>
          ))}
        </div>
      )}
    </div>
  );
}

3. 对齐Redux Thunk的参数传递

你的sendPost函数定义了三个参数,但PostForm传递的是一个对象,而且jsonplaceholder会自动生成id,不需要手动传入。调整postReducers.js里的sendPost:

export const sendPost = (post) => {
  return (dispatch, getState) => {
    Axios.post('https://jsonplaceholder.typicode.com/posts', {
      title: post.title,
      body: post.body,
      // 无需手动传id,后端会自动生成
    }).then(res => {
      dispatch(submitPost(res.data));
    });
  };
};

4. 修复Reducer的状态结构一致性

你的postReducer初始状态是数组,但提交后返回了对象,导致后续posts.map报错。保持状态为数组,新增文章直接追加到数组末尾:

export default function reducer(state = [], action = {}) {
  switch (action.type) {
    case FETCH_POSTS:
      return action.payload;
    case SUBMIT_POST: {
      // 保持状态为数组,添加新文章
      return [...state, action.payload];
    }
    default:
      return state;
  }
}

5. 修正Store的初始状态

store里的初始posts是对象,和reducer的数组初始状态不一致,改成空数组:

const initialState = {
  posts: [],
};

完成这些修改后,你就能正常捕获表单输入的数据,提交后Redux状态会更新,页面也能显示新添加的文章了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 09:17:47