从 Formik 组件中的上下文调用函数将导致警告

Posted

技术标签:

【中文标题】从 Formik 组件中的上下文调用函数将导致警告【英文标题】:invoke function from context in Formik component will cause warning 【发布时间】:2021-10-06 22:23:36 【问题描述】:
   <Formik
        enableReinitialize
        initialValues=testState
        validateOnChange
        onSubmit=onSubmit>
            (formProps) => 
              formProps.dirty && !isEmpty(formProps.touched) && handleFormDirty();
              return (
                <TestComponent />
              );
            
     </Formik>

handleFormDirty 是来自 React 上下文的函数,它将改变 React 上下文中的状态。但是,当我尝试调用 handleFormDirty 时,它会显示如下警告:

要在 Formik 中找到错误的 setState() 调用,请按照描述的堆栈跟踪进行操作

我在这里setState called in render prop is causing a react warning 发现了一个类似的问题,但答案似乎并不完美。

有什么想法吗?非常感谢。

【问题讨论】:

为什么每次渲染都调用它?它实际上是做什么的? 当我单击取消按钮或面包屑链接以在表单变脏和触摸时离开页面时,我需要弹出一个模式。然后我使用 handleFormDirty 来改变状态 isFormdirty。 【参考方案1】:

做一个效果。你不能在渲染的同时更新状态:


const ParentComponent = (props) => 

   return (
     <Formik
        enableReinitialize
        initialValues=testState
        validateOnChange
        onSubmit=onSubmit
     >
          (formProps) => <MyFormComponent ...formProps handleDirty=handleFormDirty/>
     </Formik>
   );



const MyFormComponent = (handleDirty,...formProps) => 

  useEffect(() => 
    formProps.dirty && !isEmpty(formProps.touched) && handleFormDirty();
  ,[formProps.touched,formProps.dirty,handleDirty]);

  return (
    <TestComponent/>
  );




【讨论】:

以上是关于从 Formik 组件中的上下文调用函数将导致警告的主要内容,如果未能解决你的问题,请参考以下文章

在一个组件中使用 formik-material-ui TextField 和 material-ui TextField 时出现“警告:Prop `className` 不匹配...”

redux store dispatch 导致 React 中的 setState error()

传递给反应组件子级的函数不接收函数上下文

将 Material-UI 的 Autocomplete 组件与 Formik 一起使用

将 Formik 值提升到更高级别的状态

从功能性 React 组件传递 AgGrid 上下文