web-dev-qa-db-ja.com

redux-formを使用してテキストフィールドに入力できない

Redux-formを使用したモーダルのフォームがあります。いくつかのテキストフィールドがありますが、入力できません。私の疑いは、テキストフィールドがreduxフォームからonChangeイベントを取得しないが、私が何をしているかの手掛かりを見つけることができなかったということです。

私のコードは:

import React from 'react'
import { Button, Modal, Form, Message } from 'semantic-ui-react'
import { Field, reduxForm } from 'redux-form'

const renderField = ({ input, label, type, meta: { touched, error, warning } }) => {
  console.log(input)
  return (
  <Form.Field>
    <label>{label}</label>
    <input {...input} placeholder={label} type={type} />
    {touched && (error && <Message error>{error}</Message>)}
  </Form.Field>
)}

let AddNewModal = (props) => {
  const { handleSubmit, pristine, submitting, closeNewSite, isAddNewOpen, submit } = props

  return (
    <Modal dimmer='blurring' open={isAddNewOpen} onClose={closeNewSite}>
      <Modal.Header>Add a new site</Modal.Header>
      <Modal.Content>
        <Form onSubmit={handleSubmit}>
          <Form.Group widths='equal'>
            <Field name='domain' type='text' component={renderField} label='Domain' />
            <Field name='sitemap' type='text' component={renderField} label='Sitemap URL' />
          </Form.Group>
          /**
           * Other fields 
           * /
          <Button type='submit' disabled={pristine || submitting}>Save</Button>
        </Form>
      </Modal.Content>
      <Modal.Actions>
        <Button color='black' onClick={closeNewSite} content='Close' />
        <Button positive icon='save' labelPosition='right' onClick={submit} content='Save' disabled={pristine || submitting} />
      </Modal.Actions>
    </Modal>
  )
}

export default reduxForm({
  form: 'newsite'
})(AddNewModal)
14
Hunrik

私は減速機を追加しましたが、それでも同じ問題が発生しました。ついに、attr 'form'を追加する必要があることがわかりました。

const reducers = {
  routing,
  form: formReducer
};
45
Jin

問題が見つかりました。 redux-formのリデューサーを注入するのを忘れました。

10
Hunrik

実際に同様の問題がありました。 redux-formのV6でのフォーム検証のために作業しているコードを投稿します。現在は機能しますが、確認したいのは、componentDidMount、handleInitialize、およびhandleFormSubmitです。これを見つけたところ link

/**
* Created by marcusjwhelan on 10/22/16.
*/

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

const renderInput = ({ input, label, type, meta: {touched, invalid, error }}) => (
  <div className={`form-group ${touched && invalid ? 'has-danger' : ''}`}>
    <label>{label}</label>
    <input className="form-control" {...input} type={type}/>
    <div className="text-help" style={{color: 'red'}}>
      { touched ? error : '' }
    </div>
  </div>
);

const renderTextarea = ({ input, label, type, meta: {touched, invalid, error }}) => (
  <div className={`form-group ${touched && invalid ? 'has-danger' : ''}`}>
    <label>{label}</label>
    <textarea className="form-control" {...input}/>
    <div className="text-help" style={{color: 'red'}}>
      { touched ? error : '' }
    </div>
  </div>
);

class PostsNew extends Component{
  componentDidMount(){
  this.handleInitialize();
}
handleInitialize(){
  const initData = {
    "title": '',
    "categories": '',
    "content": ''
  };
  this.props.initialize(initData);
}

handleFormSubmit(formProps){
  this.props.createPost(formProps)
}

render(){
  const { handleSubmit } = this.props;
  return (
    <form onSubmit={handleSubmit(this.handleFormSubmit.bind(this))}>
      <h3>Create A New Post</h3>

      <Field
        label="Title"
        name="title"
        type="text"
        component={renderInput} />

      <Field
        label="Categories"
        name="categories"
        type="text"
        component={renderInput}
      />

      <Field
        label="Content"
        name="content"
        component={renderTextarea}
      />

      <button type="submit" className="btn btn-primary" >Submit</button>
    </form>
  );
}
}

function validate(formProps){
  const errors = {};

  if(!formProps.title){
    errors.title = 'Enter a username';
  }
  if(!formProps.categories){
    errors.categories = 'Enter categories';
  }
  if(!formProps.content){
    errors.content = 'Enter content';
  }
  return errors;
}

const form = reduxForm({
  form: 'PostsNewForm', 
  validate
});

export default connect(null, { createPost })(form(PostsNew));
1
mjwrazor