Quantcast
Channel: かずきのBlog@hatena
Viewing all articles
Browse latest Browse all 1387

TypeScript + Reactのredux-formでサブミット時に検証を行う

$
0
0

redux-formのhandleSubmitに検証処理を渡すことでサブミット時に検証ロジックを走らせることができます。 こいつは、非同期前提なのでPromiseを返す感じのシグネチャになってます。

フォーム部分のコードの抜粋はこんな感じになります。validateContentメソッドが検証ロジックになります。引数にはフォームのデータとRedux.Dispatchが渡されてきます。Redux.Dispatchを使って、検証結果が正しい時や正しくないときに柔軟にアクションを発行することが出来るようになっています。

import * as React from 'react';
import * as ReduxForm from 'redux-form';
import * as Redux from 'redux';
import * as rootReducers from '../reducers/rootReducers';
import * as calcActions from '../actions/calcActions';

interface IndexPageProps extends ReduxForm.ReduxFormProps {
    lhs?: number;
    rhs?: number;
    answer?: number;
}interface FormData {
    lhsField: string;
    rhsField: string;
}class IndexPage extends React.Component<IndexPageProps, {}> {private validateContent(data: FormData, dispatch: Redux.Dispatch) {returnnew Promise((resolve, reject) => {var result = {} as FormData;
            if (!parseFloat(data.lhsField)) {
                result.lhsField = '数字で頼む'
                reject(result);
                return;
            }if (!parseFloat(data.rhsField)) {
                result.rhsField = '数字で頼む'
                reject(result);
                return;
            }

            dispatch(calcActions.setInput(parseFloat(data.lhsField), parseFloat(data.rhsField)));
            dispatch(calcActions.setAnswer(10));
            resolve();
        });
    }

    render() {const{
            handleSubmit,
            fields: {lhsField, rhsField},
            lhs,
            rhs,
            answer
        } = this.props;
        return (
            <form onSubmit={handleSubmit(this.validateContent)}>
                <div>
                    <input type='text'{...lhsField} />{lhsField.error && <span>{lhsField.error}</span>}<br/>
                    <input type='text'{...rhsField} />{rhsField.error && <span>{rhsField.error}</span>}<br/>
                    <input type='submit' />
                </div>
                <div>
                    <span>{lhs} + {rhs} = {answer}</span>
                </div>
            </form>
        );
    }}function select(state: rootReducers.AppState): IndexPageProps {return{
        lhs: state.calc.lhs,
        rhs: state.calc.rhs,
        answer: state.calc.answer
    };
}exportdefault ReduxForm.reduxForm({
    form: 'IndexForm',
    fields: ['lhsField', 'rhsField']}, select)(IndexPage);

いい感じ。


Viewing all articles
Browse latest Browse all 1387

Trending Articles



<script src="https://jsc.adskeeper.com/r/s/rssing.com.1596347.js" async> </script>