2016-11-27 5 views
0

最近Reduxフォーム5.3.1からReduxフォーム6.2にアップグレードしましたが、カスタムアクションクリエータをフォーム送信にディスパッチできませんでした。それは機能ではないと表示されます。しかし、formPropsは検査され、handleFormSubmitが正しく呼び出されると正しくなります。プロパティーにマップされたアクションは認識されません。アクションとステートをReduxFormにマッピング

かなり自信を持って

アップデートは、それがreduxForm呼び出しのAPIの変更です。 Reduxのフォーム6.2から

https://gist.github.com/insin/bbf116e8ea10ef38447b

コード:

import React, { Component } from 'react'; 
import { connect } from 'react-redux'; 
import * as actions from '../../actions'; 
import { Field, reduxForm } from 'redux-form'; 
import InputField from '../input-field/index.js'; 

class Signup extends Component { 
    handleFormSubmit(formProps) { 
    // PROBLEM -> Uncaught TypeError: this.props.signupUser is not a function 
    this.props.signupUser(formProps); 
    } 

    render() { 
    const { handleSubmit, submitting } = this.props; 

    return (
     <form onSubmit={ handleSubmit(this.handleFormSubmit.bind(this)) } > 
     <Field name="username" type="text" component={ InputField } label="Username" /> 
     <Field name="email" type="email" component={ InputField } label="Email" /> 
     <Field name="password" type="password" component={ InputField } label="Password" /> 
     <Field name="password_confirmation" type="password" component={ InputField } label="Confirmation" /> 
     <div> 
      <button type="submit" disabled={ submitting }>Submit</button> 
     </div> 
     </form> 
    ); 
    } 
} 

function mapStateToProps({ auth }) { 
    return { errorMessage: auth.errors }; 
} 

export default reduxForm({ 
    form: 'signup', 
    warn, 
    validate 
}, mapStateToProps, actions)(Signup); 

signupUserアクションの作成者

export function signupUser(props) { 
    return dispatch => { 
    axios.post(`${apiRoot}users`, { user: { ...props } }) 
     .then(response => { 
      const { status, errors, access_token, username } = response.data; 

      if (status === 'created') { 
      // handler 
      } 
      else { 
      dispatch(authError(errors)); 
      } 
     }) 
     .catch(err => dispatch(authError(err.message))); 
    } 
} 

以前働いコード(5.3

このhttps://github.com/erikras/redux-form/issues/2013

は解決策になるかもしれません。 1):

class Signup extends Component { 
    handleFormSubmit(formProps) { 
    this.props.signupUser(formProps); 
    } 

    render() { 
    const { 
     handleSubmit, 
     fields: { 
     email, 
     password, 
     password_confirmation, 
     username, 
     } 
    } = this.props; 

    return (
     <form onSubmit={handleSubmit(this.handleFormSubmit.bind(this))}> 
      <fieldset className="form-group"> 
      <label>Username:</label> 
      <input className="form-control" {...username} /> 
      {username.touched && username.error && <div className="error">{username.error}</div>} 
      </fieldset> 
      <fieldset className="form-group"> 
      <label>Email:</label> 
      <input className="form-control" {...email} /> 
      {email.touched && email.error && <div className="error">{email.error}</div>} 
      </fieldset> 
      <fieldset className="form-group"> 
      <label>Password:</label> 
      <input type="password" className="form-control" {...password} /> 
      {password.touched && password.error && <div className="error">{password.error}</div>} 
      </fieldset> 
      <fieldset className="form-group"> 
      <label>Confirm Password:</label> 
      <input type="password" className="form-control" {...password_confirmation} /> 
      {password_confirmation.touched && password_confirmation.error && <div className="error">{password_confirmation.error}</div>} 
      </fieldset> 
      <button action="submit">Sign up</button> 
     </form> 
    ); 
} 

エラー処理とは別に、非常によく似ています。明らかに、それはメジャーバージョンの変更です、私はちょうどアクション作成者が未定義になる理由を見ていないだけです。私はconnectコールを​​3210機能を使用するように変更しようとしましたが、同じ結果がありました。デバッガを投げて小道具を調べると、どの機能も小道具にマッピングされません。何が起こった?

フォームハンドラの送信をキャプチャする方法はありますか?私はあなたがフォーム提出をキャプチャしたくない状況を考えることができません。

答えて

0

6+バージョンでは、reduxForm APIの動作が変更されました。代わりに、それは代わりに

export default reduxForm({ 
    form: 'name-of-form', 
    fields: ['field1', 'field2'], 
    // other configs 
}, mapStateToProps, actions)(ComponentName); 

形をとるのあなたはReduxのプロパティとアクションを接続したい場合、あなたはこのようなReduxのconnect機能を使用する必要があります。

const form = reduxForm({ 
    form: 'name-of-form', 
    // other configs 
}); 

export default connect(mapStateToProps, actions)(form(ComponentName)); 

これが今の私のために働いています。

0

connect INGの私の道:

import { connect } from 'react-redux'; 

class Signup extends Component { 

    // ... 

} 

const SignupForm = reduxForm({ 
    form: 'signup', 
    warn, 
    validate 
})(Signup); 

export default connect(
    ({ auth }) => ({ 
    errorMessage: auth.errors 
    }), 
    { 
    ...actions 
    } 
)(SignupForm); 
0

6.xのに5.xのから変更reduxForm()のためのAPI

5.xを使えば、あなたが今やっていることを正確に行うことができるように使用します。

import * as actions from '../../actions'; 

function mapStateToProps({ auth }) { 
    return { errorMessage: auth.errors }; 
} 

export default reduxForm({ 
    form: 'signup', 
    warn, 
    validate 
}, mapStateToProps, actions)(Signup); 

を6.xのでは、彼らは唯一のあなたはconfigオブジェクトに渡すことができます。ただし、official redux-form documentation for 6.2.0 (see bottom of page)は次を推奨します。

import * as actions from '../../actions'; 

function mapStateToProps({ auth }) { 
    return { errorMessage: auth.errors }; 
} 

Signup = reduxForm({ 
    form: 'signup', 
    warn, 
    validate 
})(SupportForm); 

export default connect(mapStateToProps, actions)(Signup); 
関連する問題