reactjs - formik 嵌套动态对象
问题描述
您能否就以下问题提出解决方案:
例如,我们有一个包含许多交付选项的结帐表格,每个选项都需要不同的详细信息,例如:
- 店内 - 只需要
storeId
- 送货处 - 要求
cityId
和officeId
- courier - 需要
address
字段(街道、建筑物)
状态示例:
...,
delivery: {
type: 'inStore',
details: { storeId: 1 }
}
或者
...,
delivery: {
type: 'courier',
details: {
address: {
street: '12 Ave',
...,
}
}
}
一旦只能检查上述选项之一,我就尝试使用单选按钮组件来定义 adelivery type
此外,可以基于delivery type
(例如通过 switch-case)呈现不同的组件并填充不同的delivery.___
字段。
但是,如果我们为选项填写表格,inStore
然后切换到例如courier
选项,则该storeId
属性仍处于该状态。那么如何正确处理此开关(仅根据 selected 保留所需的属性delivery type
)
解决方案
就目前而言,我已将子表单状态重置添加到单选按钮onChange
事件处理程序。因此基于新的单选按钮值(例如deliveryType
)计算出新的初始状态(例如deliveryDetails
)。
正因为如此,newdeliveryType
和 newinitialState
允许渲染相关的子表单没有任何麻烦。
请在此处查看解决方案:https ://codesandbox.io/s/formik-example-forked-ix0nt?file=/deliveryDetailsForm.js
值得一提的是,需要先更新子表单初始状态,再更新因变量(如deliveryType
)。因此,只要在呈现所需的子表单之前values.delivery.details
更新对象,就不会发生“受控到不受控”错误。
PS 当前的解决方案用于switch-case
决定initialState
应该渲染哪个子表单和哪个子表单,这是一个非常糟糕的设计,所以如果你有任何关于如何让它变得更好的建议,我会很高兴听到它们。
推荐阅读
- python - 如何返回大于 x 的最后一个元素的值
- windows - 如何在 QT 安装程序框架中区分每个用户和系统范围的安装?
- heroku - Heroku 生成的 DNS 目标
- ide - OSDEV 有 IDE 吗?
- django - Python opencv等待相机空闲
- travis-ci - Travis CI 未定义对 SDL2 和 GLEW 函数的引用
- haskell - 两条线和两个平面的交点
- ruby-on-rails - 从 rails 应用程序提供编译的 javascript 和 css 文件以在外部站点中使用
- android - 执行flutter clean时flutter无法删除build文件夹
- sql-server - 尝试在 Windows 上将 Linux 与 SQL Server 连接的连接问题