2016-06-16 8 views
1

Ich versuche, ein Benutzerregistrierungsformular zu erstellen, das eine Komponente mit dem Namen UserRegistrationForm und einen Container namens UserRegistration hat. Obwohl ich sicher, habe ich die Redux-Form‘Minderer form in den Wurzelreduzierer montiert, bekomme ich noch die folgenden Fehler in der Konsole meines Browsers:Integrieren von redux-form mit redux-sagas in react.js app

Uncaught (in promise) Error: You need to mount the redux-form reducer at "form"(…) 

Der UserRegistrationForm Code:

import React, { PropTypes, Component } from 'react'; 
import { reduxForm } from 'redux-form'; 

// react mui: 
import TextField from 'material-ui/TextField'; 
import RaisedButton from 'material-ui/RaisedButton'; 

import styles from './styles.css'; 

// form elements 
export const fields = ['username', 'email', 'password', 'passwordConfirm']; 

const validate = values => { 
    const errors = {}; 
    if (!values.username) { 
     errors.username = 'Required'; 
    } else if (values.username.length < 3 || values.username.length > 20) { 
     errors.username = 'Username length must between 3 and 20 characters'; 
    } 
    return errors; 
} // validate 

export class UserRegistrationForm extends Component { 
    render() { 
    const { fields: { username, email, password, passwordConfirm }, resetForm, handleSubmit, submitting} = this.props; 
    return (
     <div className={ styles.userRegistrationForm }> 
     <form onSubmit={handleSubmit}> 
      <TextField 
       ref="username" 
       hintText="Username" 
       floatingLabelText="Username" 
       errorText="" 
      /><br /> 
      <TextField 
       ref="email" 
       hintText="Email" 
       floatingLabelText="Email" 
       errorText="" 
      /><br /> 
      <TextField 
       ref="password" 
       hintText="Password" 
       floatingLabelText="Password" 
       type="password" 
       errorText="" 
      /><br /> 
      <TextField 
       ref="confirm_password" 
       hintText="Confirm Password" 
       floatingLabelText="Confirm Password" 
       type="password" 
       errorText="" 
      /><br /> 
     </form> 
     </div> 
    ); 
    } 
} 

UserRegistrationForm.propTypes = { 
    fields: PropTypes.object.isRequired, 
    handleSubmit: PropTypes.func.isRequired, 
    resetForm: PropTypes.func.isRequired, 
    submitting: PropTypes.bool.isRequired, 
}; 

export default reduxForm({ 
    form: 'form', 
    fields, 
    validate, 
    onSubmit: (values) => { 
     return new Promise((resolve, reject) => { 
      console.info('dispatching submit'); 
     }); 
    } 
})(UserRegistrationForm); 

Der Behälter Userregistrierung Code:

import React, { PropTypes, Component } from 'react'; 
import { connect } from 'react-redux'; 
import selectUserRegistration from './selectors'; 
import { createSelector } from 'reselect'; 

import { 
    selectReduxForm 
} from 'utils/reduxFormSelector'; 

import styles from './styles.css'; 

import {initialize} from 'redux-form'; 

// component 
import UserRegistrationForm from '../../components/UserRegistrationForm'; 

export class UserRegistration extends Component { // eslint-disable-line react/prefer-stateless-function 
    constructor(props, context) { 
     super(props, context); 
     // this.submitForm = this.props.handleSubmit.bind(this); 
    } 

    handleSubmit(data) { 
     console.info('submitting form data: ', data); 
    } 

    render() { 
     return (
      <div className={ styles.userRegistration }> 
      This is UserRegistration container ! 
      <UserRegistrationForm onSubmit={this.handleSubmit} /> 
      </div> 
     ); 
    } 
} 

// const mapStateToProps = selectUserRegistration(); 

function mapDispatchToProps(dispatch) { 
    return { 
    handleSubmit: (data) => dispatch(this.handleSubmit(data)), 
    dispatch, 
    }; 
} 

export default connect(() => ({ }), {initialize})(UserRegistration); 

Ich weiß Redux-Sagas arbeiten sehr anders als Redox-Thunk und erfordern möglicherweise Selektor auf den Reduzierstücken. Ich habe versucht die folgenden Selektor auf dem Formular zu erstellen, aber es hat nichts im Minderer für den Schlüssel form erhalten:

import { createSelector } from 'reselect'; 

const selectReduxFormDomain =() => state => { 
    let reduxForm = state.get('form'); // root reducer 
    return reduxForm; 
}; 

const selectReduxForm =() => createSelector(
    selectReduxFormDomain(), 
    (substate) => substate 
); 

export default selectReduxForm; 
export { 
    selectReduxFormDomain, 
    selectReduxForm, 
}; 
+0

Der entsprechende Code, der hier angezeigt wird, wäre der Code, der den Reduzierer definiert, den Sie an den Redux-Speicher übergeben, wenn Sie ihn erstellen. – stone

Antwort