You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

withFormik初始props变更后表单值未更新问题求助

解决Formik中Props变更后表单值不更新的问题

这个问题我之前也碰到过!Formik的mapPropsToValues默认只会在组件首次挂载的时候执行一次,所以哪怕后续props.initialData更新了,表单里的values也不会跟着同步——这就是你看到的问题所在。下面给你两个实用的解决办法:

方法1:启用enableReinitialize配置项(最简单方案)

这是最直接的解决方式,只需要在withFormik的配置里添加enableReinitialize: true,就能让Formik在props变化时重新调用mapPropsToValues来更新表单值。修改后的代码如下:

export default withFormik({
  mapPropsToValues: (props: Props) => {
    return { id: props.initialData.id, name: props.initialData.name };
  },
  handleSubmit: (values, { props, setSubmitting }) => {
    props.submitHandler(values);
    setSubmitting(false); // 别忘了提交后重置submitting状态哦
  },
  enableReinitialize: true, // 关键配置!开启props变更时的重新初始化
})(NewDatasourceForm);

这个配置相当于告诉Formik:“只要组件的props变了,就重新根据新props生成表单值”,完全匹配你的需求,代码改动极小。

方法2:手动监听props变化并更新(适合自定义场景)

如果你的业务场景需要更精细的控制(比如只更新部分字段、更新前做校验判断),可以在NewDatasourceForm组件内部用useEffect监听props.initialData的变化,然后调用Formik提供的setValues方法手动更新:

const NewDatasourceForm = (props) => {
  const { values, touched, setValues } = props;
  
  useEffect(() => {
    // 当initialData发生变化时,同步更新表单指定字段
    setValues({
      id: props.initialData.id,
      name: props.initialData.name
    });
  }, [props.initialData, setValues]); // 依赖项要完整,避免遗漏更新或无限循环

  // ... 组件其余渲染逻辑
};

这种方式灵活性更高,适合有特殊业务规则的场景。

内容的提问来源于stack exchange,提问作者Abel Jojo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:40:17