在 final-form-arrays 中为数组提供初始值会导致状态更改重置整个表单,我该如何防止这种情况?

IT技术 reactjs forms react-final-form react-final-form-arrays
2021-05-21 23:13:54

我有一个使用 final-form-arrays 的表单。表单有效并且验证有效,但是,当我在组件内部进行状态更改时,它会重置我的所有值。

我能够使用 react-final-form-arrays 提供的相同示例复制该问题:

https://codesandbox.io/embed/react-final-form-field-arrays-om6p6

我添加了一个按钮来切换状态更改。本质上,只需尝试在表单中填充值,然后更改状态。表格将重置,我无法弄清楚为什么会这样。如果我删除初始值,这不会发生。

有谁知道为什么会这样?

2个回答

2 问题。

  1. 您将内联 renderProp 传递给 Form 组件,这意味着每次组件渲染时它都会创建一个新函数,这会导致您的表单重置。解决方案是将 renderProp 移动到上面的函数中并将其传入,最好使用 useCallback 进行记忆。
  2. 修复上述问题后,表单仍将重置。这是因为您将内联数组传递给 initialValues。每次您的组件呈现时,这将再次创建一个新数组,从而重置您的表单。将其移动到变量中并传入。

这是一个非常常见的初学者错误,您应该阅读 React 如何进行引用相等性检查以找出要重新渲染的组件。

固定版本:https : //codesandbox.io/embed/react-final-form-field-arrays-c6hgu

只需在箭头函数中记住您的初始值,然后将其传递给表单组件:

const initialValues = useCallback(() => {
    return {data: [{}]};
    // eslint-disable-next-line react-hooks/exhaustive-deps
}, []);

将该函数作为您的 Form 组件的 initialValues props传递。