私のプロジェクトでは、React
とRedux-Form
のフォームを作成しています。我々は、2つの入力の値によって構成される単一の情報を持っています。しかし、各入力の値は結合され、一緒に検証されます。Reduxフォームで複数入力フィールドを使用する良い方法はありますか?
最初の実装は、各コンポーネントをField
に接続することでした。状態を正しく更新するようにしましたが、validate
小道具と一緒にすべての値を検証することはできませんでした。
Fields
コンポーネントを使用していましたが、validate
支柱はありませんでした。私たちはプルリクエストを作成すると考えましたが、そのためのAPIはまだ明確ではありません。Fields
小道具(例えば、parse
とformat
)の2つの値と動作の組み合わせを検証したいのは異なるFields
コンポーネント内の各入力用の機能。
コンポーネントを作成してアプリケーション状態に接続するのに、Field
を使用することは可能ですが、触った小道具や状態を更新するためのコールバックやその他のものを管理したくありませんでした。 Redux-Form
のすべてが完了しているので気づいたこともあります。
実際、私は実装に終わるが、それは非常に優雅に見えなかった。実装を見て、あなたの意見を述べ、他の解決策を提案してください。この解決策が実装されていないとしても、私たちはおそらくそれについて引き出し要求を開くことができます。Redux-Form
ここ
は、私は2つの参照例実装
シンプルな形容器
import SimpleForm from 'app/simpleForm/components/simpleForm'
import { reduxForm } from 'redux-form'
export default reduxForm({
form: 'simpleForm'
})(SimpleForm)
単純なフォーム成分
import React from 'react'
import { Field } from 'redux-form'
import MultiInputText from 'app/simpleForm/components/multiInputText'
const onSubmit = values => alert(JSON.stringify(values))
const validateAddress = (value) => {
if (!value) return 'Address is empty'
if (!value.street) return 'Street is empty'
if (!value.number) return 'Number is empty'
return null
}
const SimpleForm = ({ handleSubmit }) => {
return (
<form onSubmit={ handleSubmit(onSubmit) }>
<Field label="Home Address" name="home" component={MultiInputText} type="text" validate={validateAddress}/>
<Field label="Work Address" name="work" component={MultiInputText} type="text" validate={validateAddress}/>
<button type="submit">Submit</button>
</form>
)
}
export default SimpleForm
MultiInputText成分
import React from 'react'
import { Fields, FormSection } from 'redux-form'
const renderAddreessInputs = ({ street, number, error }) => (<div>
<input {...street.input} type="text" />
<input {...number.input} type="text" />
{ street.meta.touched && number.meta.touched && error && <span className="error">{error}</span> }
</div>)
const MultiInputText = (props) => {
const { input: { name }, label, meta: { error }} = props
const names = [
'street',
'number'
]
return (<div>
<label htmlFor={name}>{label}</label>
<FormSection name={name}>
<Fields names={names} component={renderAddreessInputs} error={error}/>
</FormSection>
</div>)
}
export default MultiInputText
答えのためのThansks。私は、オプション2が我々の文脈にとってより良いと思う。しかし、「触れた」旗の上に「還元形」の支持を失うことは悲しかった。私はコンポーネント状態と 'touch'アクション作成者でそれを扱うことができました。最終的にはOKになりますが、他のフラグが必要な場合は、コンポーネントに多くのものが入る可能性があります。 –