在很多情况下,我们可能希望在表单中设置特定字段的值以帮助用户。
例如,在线水果店可能会询问用户他们想买多少苹果。为了帮助用户,我们可以有 3 个按钮,例如
- "minimum" - 将字段值设置为商店可以销售的最小数量
- “最大” - 同上,但最大
- “我上次买的东西” - 将字段值设置为用户上次购买的苹果数量
在查看了我认为最相关的两个示例(加载和初始化值和计算字段)之后,我仍然无法在不变得太笨拙的情况下弄清楚这一点。
我们如何从用户的操作(例如单击按钮)中设置字段的值?
这可以通过向组件提供一个包含必要修改器的mutators
对象来实现Form
,这些修改器将可供您的组件使用:
<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={({ form, ...rest }) => (
<>
<button onClick={form.mutators.setMin}>minimum apples</button>
<button onClick={form.mutators.setMax}>maximum apples</button>
<button onClick={form.mutators.setLast}>what I bought last time</button>
</>
)}
/>
正如下面@davnicwil 所建议的,如果您需要从 React 应用程序外部与表单进行交互(例如,您正在使用微前端,您正在迁移应用程序,或者拥有一些位于 React 之外的第三方库)您可以使用 render 方法将表单对象(或其中的任何方法)保存到全局范围,并根据需要调用它们:
render={({ form, ...rest }) => {
window.form = form;
// ... rest of code
)}
// later anywhere else in app
window.form.mutators.setMax
接受的答案很好,让我找到了我的解决方案,但如果有人像我一样来到这里寻找一种从 React 应用程序外部修改字段值的方法,您可以通过创建一个完全通用的 mutator 来设置任何字段到任何值,并以如下形式获得对绑定突变器的全局引用
<Form
mutators={{
// expect (field, value) args from the mutator
setValue: ([field, value], state, { changeValue }) => {
changeValue(state, field, () => value)
}
}}
render={({ form, ...rest }) => {
// put the reference on a window variable of your choice here
if (!window.setFormValue) window.setFormValue = form.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')
以上适用于v5.0.0及更高版本。在早期版本中,API 略有不同。而不是 using form.mutators
,而是使用渲染功能的顶级mutators
道具,即render={({ mutators, ... }
免责声明:对于非常特殊的用例,除非绝对必要,否则不应使用此模式。例如,我使用它来自动填充必须在我的 React 应用程序外部的代码中的字段。您不应该对实际的应用程序代码执行此操作。但是,如果您确实需要这样做,它会很好用!