reactjs - 即使使用 enableReinitialize,Formik FieldArray 也不会重新渲染更新的值
问题描述
默认为假。如果 initialValues 改变(使用深度相等),控制 Formik 是否应该重置表单。
我正在传入一个我在 initialValues 中设置的对象(通过道具),对象定义是:
{
"shoppingList": {
"title": "",
"items": [ { "quantity": 0, description: "" } ]
}
}
我在 Formik FieldArray 组件中使用它。我正在使用内联箭头函数更新按钮 onClick 处理程序中的数量,该函数通过回调中的当前元素参数直接改变项目。items.#map
Formik 不会重新呈现表单以反映更新的数量。Formik 知道数量,因为当我提交表单时,组件存储数量会重新呈现为正确的更新数量。
解决方案
通过使用arrayHelpers.#replace
而不是直接更新项目来修复。
arrayHelpers 文档
答案是深度平等是基于价值的。我不确定关于基于引用的平等这个术语是否有效,但我的困惑导致我无论如何都这样问。
在这种情况下,直接改变数组中项目对象中的数据或不可变更新都可以按预期工作。不确定如果我更新的数据不是原始数据,这是否会有所不同——对于 JS 的奇妙可怕世界来说仍然是相当新的。
在这种情况下,也可以使用 enableReinitialize 或不使用。
此处的完整工作示例,使用了变异和不可变更新逻辑(一个用于减量,另一个用于加量): https ://codesandbox.io/s/k2wzk9q605?fontsize=14
推荐阅读
- android - 如何从 viewpager 中的片段获取数据并存储?
- javascript - 使用 Cheerio 节点在选项中查找特定值
- sql-server - T-SQL CONVERT datetime to varchar using style 20 vs 120
- haskell - 自增长列表的 Haskell 递归列表
- angular - 有没有办法在Angular 5中动态创建一个表 - 未知的行和列大小
- amazon-web-services - TaskDefinition - 遇到不受支持的属性名称 - 环境
- xml - 为什么 XPath 的节点测试 node() 不返回属性节点?
- ruby-on-rails - 字符串上的自定义顺序
- r - R:按组进行有效滚动计算
- java - Java EE - @MultipartConfig 不起作用