2017-05-18 23 views
0

私は基本的なポートフォリオ・ウェブサイトを作成しています。そこにはコンタクトフォームのセクションがあり、そこから人々は私のメールにFormspree経由でメッセージを送ることができます。私はこれにRedux Formsを使用していますが、フォームは機能しますが、フォームフィールドをリセットして、成功したサブミットで何らかの 'success'メッセージを追加したいと思います。Reduxフォームによる提出時にフォームをリセットするにはどうすればよいですか?

私はthis.props.resetForm()を呼び出し、dispatch(reset('ContactForm')を呼び出して2つの方法を試みました。どちらもうまくいきませんでした。ここで

コードです:

contact.js:

import React, { Component } from 'react'; 
import { connect } from 'react-redux'; 
import { Field, reduxForm } from 'redux-form'; 
import { sendMail } from '../actions'; 


class Contact extends Component { 
    renderField(field) { 
    const { meta: { touched, error } } = field; 
    const className = `form-group ${touched && error && 'has-error'}`; 

    return (
     <div className={className}> 
     <label>{field.label}</label> 
     {field.type == 'text' ? 
     <input 
      className='form-control' 
      type={field.type} 
      {...field.input} 
     /> : 
     <textarea 
      className='form-control' 
      rows='5' 
      {...field.input} 
     />} 
     <div className='help-block'> 
      {touched && error} 
     </div> 
     </div> 
    ); 
    } 

    onSubmit(values) { 
    this.props.sendMail(values,() => { 
     this.props.resetForm(); 
    }); 
    } 


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

    return (
     <div id='contact'> 
     <h1>Contact</h1> 
     <p>Feel free to drop me a mail. Whether it's work-related or about coding, tech, entrepreneurship, travel, football or life in general. I'm always looking to connect with other people.</p> 
     <div id='contact-form'> 
      <form onSubmit={handleSubmit(this.onSubmit.bind(this))}> 
      <Field 
       label='Name:' 
       name='name' 
       type='text' 
       component={this.renderField} 
      /> 
      <Field 
       label='Email:' 
       name='email' 
       type='text' 
       component={this.renderField} 
      /> 
      <Field 
       label='Message:' 
       name='message' 
       type='textarea' 
       component={this.renderField} 
      /> 
      <button 
       type='submit' 
       className='btn btn-primary' 
      > 
       Submit 
      </button> 
      </form> 

     </div> 
     </div> 
    ); 
    } 
} 

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

    if (!values.name) { 
    errors.name = "Enter a name" 
    } 

    if (!values.email) { 
    errors.email = "Enter an email" 
    } 

    if (!values.message) { 
    errors.message = "Enter a message" 
    } 
    return errors; 
} 

export default reduxForm({ 
    form: 'ContactForm', 
    validate 
})(
    connect(null, { sendMail })(Contact) 
); 

アクション/ index.js:

import axios from 'axios'; 
import { reset } from 'redux-form'; 

export const MAIL_SENT = 'MAIL_SENT'; 

const ROOT_URL='https://formspree.io/' 
const EMAIL = '[email protected]' 

export function sendMail(values) { 
    const request = axios.post(`${ROOT_URL}${EMAIL}`, values); 

    return { 
    type: MAIL_SENT, 
    payload: true 
    }; 
    dispatch(reset('ContactForm')); 
} 

答えて

0
  1. あなたはクラスの連絡先にコンストラクタを追加する必要があります。

    クラス接触延長コンポーネント{ コンストラクタ(小道具){ スーパー(小道具); } ...

  2. リターン構文の後にディスパッチ(reset( 'ContactForm'))を実行すると、決して呼び出されません。ところで、アクションクリエイターは純粋な関数であるはずです。ディスパッチアクションを追加するのは良い考えではありません。

このヘルプが必要です。

関連する問題