【问题标题】:REDUX-FORM error on handleSubmithandleSubmit 上的 REDUX-FORM 错误
【发布时间】:2017-03-15 09:29:36
【问题描述】:

我在使用 redux-form

时遇到错误

控制台中的错误消息

  • bundle.js:32511 未捕获的错误:您必须通过 handleSubmit() 一个 onSubmit 函数或将 onSubmit 作为 prop(...) 传递

上述错误出现在页面加载和按钮点击

请参考以下导致控制台错误的代码示例。

import React, { Component } from 'react';
import { reduxForm } from 'redux-form';
import { createPost } from '../actions/index';

class PostsNew extends Component {

  render() {
    const { fields: { title, categories, content }, handleSubmit } = this.props;
    return (
      <form onSubmit={handleSubmit(this.props.createPost)}>
        <h3>Create a new Post</h3>

        <div className="form-group">
          <label>Title</label>
          <input type="text" className="form-control" {...title}/>
        </div>

        <div className="form-group">
          <label>Categories</label>
          <input type="text" className="form-control" {...categories}/>
        </div>

        <div className="form-group">
          <label>Content</label>
          <textarea className="form-control" {...content}/>
        </div>
        <button type="submit" className="btn btn-primary">Submit</button>
      </form>
    );
  }
}

export default reduxForm({
  form: 'PostsNewForm',
  fields: ['title', 'categories', 'content']
}, null, { createPost })(PostsNew);

这是 StephenGrider redux 教程

的一步一步的跟随

提前谢谢:)

【问题讨论】:

  • 你是如何调用 PostsNew 组件的?
  • PostsNew 在路由中被调用 路线>

标签: reactjs redux redux-form


【解决方案1】:

你需要从父组件传递 onsubmit 属性

import React from 'react';
import { connect } from 'react-redux';
import { initialize } from 'redux-form';
import PostsNew from './PostsNew';


class App extends React.Component {

  handleSubmit(data) {
    console.log('Submission received!', data);
    this.props.dispatch(initialize('contact', {})); // clear form
  }

  render() {
    return (
      <div id="app">
        <h1>App</h1>
        <PostsNew onSubmit={this.handleSubmit.bind(this)}/>
      </div>
    );
  }

}

export default connect()(App);

【讨论】:

    【解决方案2】:

    如果PostsNew 是容器(如果这是直接从路由调用),那么您必须创建handleSubmit 函数而不是从this.props 获取

    import React, { Component } from 'react';
    import { reduxForm } from 'redux-form';
    import { createPost } from '../actions/index';
    
    class PostsNew extends Component {
    
      handleSubmit(formValues){
        console.log(formValues);
        //do what ever you want
      }
    
      render() {
        const { fields: { title, categories, content } } = this.props;
        return (
          <form onSubmit={this.handleSubmit(this.props.createPost)}>
            <h3>Create a new Post</h3>
    
            <div className="form-group">
              <label>Title</label>
              <input type="text" className="form-control" {...title}/>
            </div>
    
            <div className="form-group">
              <label>Categories</label>
              <input type="text" className="form-control" {...categories}/>
            </div>
    
            <div className="form-group">
              <label>Content</label>
              <textarea className="form-control" {...content}/>
            </div>
            <button type="submit" className="btn btn-primary">Submit</button>
          </form>
        );
      }
    }
    


    如果PostsNew 是在容器内使用的 React 组件,那么您可以在 propsPostsNew 中传递 handleSubmit

    <PostsNew
     handleSubmit={ (values) => {console.log(values)}}
    />
    

    【讨论】:

    • 是的很酷,但是当你从道具中获得“handleSubmit”时它不起作用!
    • @Kartik_Agarwal:这只是提交表单并重新加载没有任何反应。表单值未定义..
    • @dev_kishore:你能发布完整的解决方案吗?
    【解决方案3】:

    在我明确将连接导入文件之前,我遇到了同样的问题。之后,我就可以成功调用 this.props.createPost 了。

    这是我的解决方案:

    import React, { Component } from 'react';
    import { Field, reduxForm } from 'redux-form'
    import { createPost } from '../actions/index';
    import { connect } from 'react-redux';
    
    class PostsNew extends Component {
        render() {
            const { handleSubmit } = this.props;
            return (
                 <form onSubmit={handleSubmit(this.props.createPost)}>
                 <h3>Create a New Post</h3>
                 <div className="form-group">
                     <label>Title</label>
                     <Field name="title" component="input" type="text" className="form-control" placeholder="Title" />
                 </div>
                 <div className="form-group">
                    <label>Categories</label>
                    <Field name="categories" component="input" type="text" className="form-control" placeholder="Title" />
                 </div>
                 <div className="form-group">
                    <label>Content</label>
                    <Field name="content" component="textarea" type="text" className="form-control" placeholder="Title" />
                 </div>
                 <button type="submit" className="btn btn-primary">Submit</button>
             </form>
            );
        }
    }
    
    export default connect(null, {createPost})(reduxForm({
        form: 'PostsNew'
    })(PostsNew));
    

    【讨论】:

      【解决方案4】:

      这非常有效。检查您的动作创建者,您的动作创建者中应该有拼写错误。请参考以下动作创建者。如果您按照他提到的步骤进行操作,这应该可以完美运行。错误说的是你的道具中没有名为 createPost 的东西。更多信息你可以在 github 找到我的工作项目here

      export function createPost(props) {
        console.log(props);
        const request = axios.post(`${ROOT_URL}/posts${API_KEY}`, props);
        return {
          type: CREATE_POST,
          payload: request
        };
      }
      

      【讨论】:

        【解决方案5】:

        请安装 redux-form5 版本。

        npm install --save redux-form@5

        【讨论】:

          猜你喜欢
          • 2017-07-23
          • 2016-09-29
          • 1970-01-01
          • 2018-08-16
          • 1970-01-01
          • 2021-02-04
          • 2018-07-21
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多