【问题标题】:How to update a field value after action dispatched with redux如何在使用 redux 分派操作后更新字段值
【发布时间】:2016-09-20 20:18:50
【问题描述】:

我想在使用 redux 进行 ajax 调用后填充一个表单。

我的情况很简单:

  • 我有一个简单的用户表单(目前只有一个文本字段),它是一个绑定到connect() 状态的反应视图。
  • 我调用了一个 REST API 来获取用户。
  • 当 api 调用完成时,会向用户发送一个操作。
  • reducer 与用户一起更新存储状态。
  • 我想用检索到的值填充/更新表单。

解决方案 1:

如果我这样设置道具的值:

const Field = ({ field, onFieldChange, value }) => (
  <input 
    value={value} 
    onChange={(event) => { onFieldChange(field, event.target.value) }} 
    type="text" 
  />
)

它有效,但我收到此警告:

Field is changing an uncontrolled input of type text to be controlled. Input elements should not switch from uncontrolled to controlled (or vice versa).

我明白为什么会出现此错误,因为我不应该使用组件来显示某些内容并且也能够对其进行更新。

我也尝试使用 defaultValue 道具,但这仅在组件创建时使用(而且我们还没有用户)。 ajax调用返回后,无法调用defaultValue。

解决方案 2:

每次状态更新时,使用带有自定义插件的 redux-form 来更新表单模型。我觉得这个解决方案不是很干净,但也许我错了。

我真的认为我走错了方向,它应该存在更好的方式。

有人遇到过这种问题吗?

【问题讨论】:

    标签: javascript reactjs redux redux-form


    【解决方案1】:

    我在尝试将undefined 作为输入值传递时遇到了同样的问题。

    要解决此问题,请确保您至少将空字符串传递给输入,而不是未定义

    const Field = ({ field, onFieldChange, value }) => (
      <input 
        value={value || ''} // <- add fallback value here
        onChange={(event) => { onFieldChange(field, event.target.value) }} 
        type="text" 
      />
    )
    

    【讨论】:

    • 太棒了,它修复了它。我太绝望了,非常感谢!
    【解决方案2】:
    1. 实际上,您可能会尝试使您的组件有状态 - 在其中存储和管理输入值 (they say it's ok)。
    2. 或者如果你真的需要这个值在商店使用redux-form,我有很好的使用经验(你必须编写更少的样板代码)。 顺便说一句,你不必使用任何自定义插件,你可以使用initialValues,查看更多here

    上面的解决方案肯定会起作用,但似乎不太好。

    【讨论】:

    • initialValues 在 redux-form 上不起作用,因为当我初始化表单时,尚未获取用户。所以表单被初始化为空,之后我无法更新它。
    • @JulienSanchez,如果您查看我向您展示的示例,您会看到表单也是异步初始化的(单击按钮时)。此外,表单可以通过发送“自己初始化动作(使用 redux-form 提供的动作创建器)”来初始化任意多次
    • 是的,但是通过表单内的按钮看到了。如此简单,您可以从表单内部发送。另外,我发现必须从表单外部调度内部事件并不是很干净:/
    • 您无需发送任何东西。您应该只定义您的 initialValues 将被加载的内容:
    • 您无需发送任何东西。您应该只定义您的 initialValues 将被加载的内容:github.com/kitos/web-purple/blob/master/src/containers/…
    猜你喜欢
    • 2020-11-09
    • 2017-10-14
    • 2020-10-18
    • 2020-08-26
    • 1970-01-01
    • 1970-01-01
    • 2018-06-18
    • 2017-03-08
    • 2018-09-03
    相关资源
    最近更新 更多