React Formik onSubmit 异步调用两次

reactjs

1个回答

写回答

takahashi

2025-07-02 12:25

+ 关注

JS
JS

React Formik是一个用于处理表单的React库。它提供了一种简洁而强大的方式来处理表单的验证、提交和处理异步操作的能力。然而,有时候我们可能会发现在使用Formik的onSubmit方法时会出现异步调用两次的情况。

在Formik中,onSubmit是一个函数,用于在表单提交时执行特定的操作。通常情况下,我们会将这个函数与API请求、数据存储等异步操作结合使用,以便在用户提交表单后进行后续处理。然而,有时候我们会发现onSubmit函数被调用了两次,这可能会导致一些问题。

造成这种情况的原因可能有很多,但最常见的原因是在组件渲染时,Formik会在内部重新实例化onSubmit函数。这意味着每当组件重新渲染时,onSubmit函数都会被重新创建,从而导致多次调用。

为了解决这个问题,我们可以使用useCallback钩子函数来确保onSubmit函数只被实例化一次。useCallback会在组件的生命周期中保持函数的稳定性,只有在依赖项发生变化时才会重新创建函数。通过使用useCallback,我们可以避免异步调用两次的问题。

下面是一个使用Formik处理表单的示例代码:

JSx

import React from "react";

import { Formik, Form, Field, ErrorMessage } from "formik";

const initialValues = {

name: "",

emAIl: "",

};

const onSubmit = async (values) => {

// 模拟异步请求

awAIt new Promise((resolve) => setTimeout(resolve, 1000));

console.log(values);

};

const App = () => {

return (

<Formik initialValues={initialValues} onSubmit={onSubmit}>

<Form>

<div>

<label htmlFor="name">姓名</label>

<Field type="text" id="name" name="name" />

<ErrorMessage name="name" component="div" />

</div>

<div>

<label htmlFor="emAIl">邮箱</label>

<Field type="emAIl" id="emAIl" name="emAIl" />

<ErrorMessage name="emAIl" component="div" />

</div>

<button type="submit">提交</button>

</Form>

</Formik>

);

};

export default App;

在上面的代码中,我们使用Formik来创建一个简单的表单。表单有两个字段:姓名和邮箱。当用户提交表单时,onSubmit函数会被调用,并且在一秒钟后打印出表单的值。

为了避免异步调用两次的问题,我们可以将onSubmit函数使用useCallback进行包裹,确保它只被实例化一次。修改后的代码如下:

JSx

// ...

const onSubmit = useCallback(async (values) => {

// 模拟异步请求

awAIt new Promise((resolve) => setTimeout(resolve, 1000));

console.log(values);

}, []);

// ...

通过使用useCallback,我们可以确保onSubmit函数只被实例化一次,并且避免了异步调用两次的问题。

:

在使用React Formik处理表单时,我们可能会遇到onSubmit异步调用两次的问题。这可能是因为组件重新渲染时,Formik会在内部重新实例化onSubmit函数。为了解决这个问题,我们可以使用useCallback钩子函数来确保onSubmit函数只被实例化一次。通过使用useCallback,我们可以避免异步调用两次的问题,同时保持代码的性能和可读性。

参考代码:

JSx

import React, { useCallback } from "react";

import { Formik, Form, Field, ErrorMessage } from "formik";

const initialValues = {

name: "",

emAIl: "",

};

const onSubmit = useCallback(async (values) => {

// 模拟异步请求

awAIt new Promise((resolve) => setTimeout(resolve, 1000));

console.log(values);

}, []);

const App = () => {

return (

<Formik initialValues={initialValues} onSubmit={onSubmit}>

<Form>

<div>

<label htmlFor="name">姓名</label>

<Field type="text" id="name" name="name" />

<ErrorMessage name="name" component="div" />

</div>

<div>

<label htmlFor="emAIl">邮箱</label>

<Field type="emAIl" id="emAIl" name="emAIl" />

<ErrorMessage name="emAIl" component="div" />

</div>

<button type="submit">提交</button>

</Form>

</Formik>

);

};

export default App;

通过以上的代码和解释,我们可以更好地理解React Formik中异步调用两次的问题,并学会了如何使用useCallback来解决这个问题。希望这篇文章对你有所帮助!

举报有用(4)分享收藏

Copyright © 2025 IZhiDa.com All Rights Reserved.

知答 版权所有 粤ICP备2023042255号