如何设置/更改外部用户操作的字段值React Final Form

时间:2018-02-21 08:19:06

标签: reactjs react-final-form final-form

在许多情况下,我们可能希望在表单中设置特定字段的值以帮助用户。

例如,在线水果店可能会询问用户他们想要购买多少苹果。为了帮助用户,我们可以有3个按钮,例如

  • "最小" - 将字段值设置为商店可以销售的最小数量
  • "最大" - 同上,但是最多
  • "我上次购买的东西" - 将字段值设置为用户上次购买的苹果数量

在完成了我认为最相关的两个例子(Loading and Initializing ValuesCalculated Fields)之后,我仍然无法解决这个问题而不会太过苛刻。

我们如何用户的操作设置字段值(例如点击按钮)?

2 个答案:

答案 0 :(得分:19)

Erik有一个很棒的post on mutators,这激励我找到我想要的解决方案:

<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>
    </>
  )}
/>

答案 1 :(得分:3)

被接受的答案很好,使我找到了解决方案,但是如果有人像我一样在这里寻找一种方法来从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应用程序外部的。您不应为实际的应用程序代码执行此操作。但是,如果您确实需要这样做,那么效果很好!