Ошибка REDUX-FORM на handleSubmit

Я получаю сообщение об ошибке при использовании redux-form

Сообщение об ошибке в консоли:

  • bundle.js: 32511 Неперехваченная ошибка: необходимо либо передать handleSubmit () функцию onSubmit, либо передать onSubmit как опору (…)

указанная выше ошибка появилась при загрузке страницы и нажатии кнопки

Пожалуйста, обратитесь к приведенному ниже образцу кода, который вызывает ошибку консоли.

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.

Заранее спасибо :)


person Kishore Chandra    schedule 02.11.2016    source источник
comment
как вы вызывали компонент PostsNew?   -  person kartikag01    schedule 02.11.2016
comment
PostsNew был вызван в маршрутах ‹Путь маршрута = / component = {App}› ‹Компонент IndexRoute = {PostsIndex} /› ‹Путь маршрута = / posts / new component = {PostsNew} /› ‹/Route›   -  person Kishore Chandra    schedule 02.11.2016


Ответы (5)


Если 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, который используется внутри контейнера, вы можете передать handleSubmit в props из PostsNew

<PostsNew
 handleSubmit={ (values) => {console.log(values)}}
/>
person kartikag01    schedule 02.11.2016
comment
Да круто, но когда вы получаете handleSubmit из реквизита, это не работает! - person Lionel Dcosta; 02.11.2016
comment
@Kartik_Agarwal: это оправдывает отправку формы и перезагружает, ничего не происходит. Значения формы не определены .. - person loneranger; 20.03.2017
comment
@dev_kishore: вы можете опубликовать полное решение. - person loneranger; 20.03.2017

Вам необходимо передать реквизиты 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);
person Lionel Dcosta    schedule 02.11.2016

У меня была та же проблема, пока я явно не импортировал соединение в свой файл. После этого я смог успешно вызвать 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));
person marquezgon    schedule 16.02.2017

Это прекрасно работает. Проверьте свой создатель действий, в вашем создателе действий должна быть ошибка опечатки. Обратитесь к создателю действия ниже. Если вы выполнили шаги, как он упомянул, это должно работать отлично. Ошибка говорит о том, что в ваших реквизитах нет того, что называется createPost. Кроме того, вы можете найти мой рабочий проект здесь в github.

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

установите версию 5 программы redux-form.

npm install --save redux-form@5

person Saad Khan    schedule 02.10.2017