ユーザーを支援するためにフォーム内の特定のフィールドの値を設定したい場合があります多くの状況があります。
たとえば、オンラインフルーツストアでは、ユーザーが購入したいリンゴの数を尋ねる場合があります。ユーザーを支援するために、次のような3つのボタンがあります。
最も関連性の高い2つの例( 値の読み込みと初期化 と 計算フィールド )を検討した後、あまりにもハッキングせずにこれを理解することはできません。
どうすればフィールドの値を設定からユーザーのアクション(ボタンをクリックするなど)にできますか?
Erikには素晴らしい ミューテーターに関する投稿 があり、私が探していた解決策を見つけるきっかけになりました。
<Form
mutators={{
setMin: (args, state, utils) => {
utils.changeValue(state, 'apples', () => 1)
},
setMax: (args, state, utils) => {
utils.changeValue(state, 'apples', () => 100)
},
setLast: (args, state, utils) => {
utils.changeValue(state, 'apples', () => 6)
},
}}
render={({ mutators, ...rest }) => (
<>
<button onClick={mutators.setMin}>minimum apples</button>
<button onClick={mutators.setMax}>maximum apples</button>
<button onClick={mutators.setLast}>what I bought last time</button>
</>
)}
/>
受け入れられた答えは素晴らしく、私の解決策に私を導きましたが、 Reactアプリケーションの外部からフィールド値を変更する方法を探していたように誰かがここに来た場合、任意のフィールドを任意の値に設定する完全に汎用的なミューテーターを作成し、次のような形式でバインドされたミューテーターへのグローバル参照を取得することでそれを行うことができます
<Form
mutators={{
// expect (field, value) args from the mutator
setValue: ([field, value], state, { changeValue }) => {
changeValue(state, field, () => value)
}
}}
render={({ mutators, ...rest }) => {
// put the reference on a window variable of your choice here
if (!window.setFormValue) window.setFormValue = mutators.setValue
return (
<>
<Field name="field1">...</Field>
<Field name="field2">...</Field>
...
</>
)
}}
/>
// somewhere else, outside of the React application
window.setFormValue('field1', 'value1')
window.setFormValue('field2', 'value2')
免責事項:上記のパターンは、非常に特定のユースケースで、絶対に必要でない限り使用しないでください。たとえば、Reactアプリの外部にあるmustのコードからのフィールドの入力を自動化するために使用しています。実際のアプリケーションコードに対してこれを行うべきではありません。しかし、あなたがそれをする必要がある場合、それは素晴らしい作品です!