TypeScript + React中封装一个hook当点击确定后提交请求 在这期间确定按钮loading展示

在TypeScript和React中封装一个自定义Hook来管理按钮的点击事件、发送请求,并在请求进行时显示加载状态,可以按照以下步骤进行:

首先,定义一个接口(如果需要的话)来描述异步函数的类型,这将作为我们自定义Hook的参数。接着,实现这个Hook并返回相关的状态和方法。

下面是一个简单的示例:

typescript 复制代码
import { useState, useCallback } from 'react';

// 如果你有特定的请求参数和响应类型,可以在这里定义它们
interface RequestParams {
  // 定义请求参数的类型
}

interface ResponseData {
  // 定义响应数据的类型
}

// 这是我们自定义Hook的类型签名
function useSubmitWithLoading<T extends RequestParams, R extends ResponseData>(
  submitFunction: (params: T) => Promise<R>
) {
  const [loading, setLoading] = useState<boolean>(false);
  const [error, setError] = useState<Error | null>(null);

  const handleSubmit = useCallback(async (params: T) => {
    setLoading(true);
    setError(null);
    try {
      const response = await submitFunction(params);
      // 处理响应
      return response;
    } catch (err) {
      setError(err as Error);
      throw err; // 如果你想在组件中进一步处理错误,可以重新抛出
    } finally {
      setLoading(false);
    }
  }, [submitFunction]);

  return { loading, error, handleSubmit };
}

export default useSubmitWithLoading;

在这个自定义Hook中,我们使用了useState来跟踪请求的加载状态和任何可能出现的错误。handleSubmit是一个封装的异步函数,它会调用传入的submitFunction并处理加载状态和错误。

在组件中使用这个Hook可能如下所示:

typescript 复制代码
import React, { FormEvent } from 'react';
import useSubmitWithLoading from './useSubmitWithLoading'; // 假设你的hook文件名是这个

// 假设这是你的API调用函数的类型
async function submitRequest(data: RequestParams): Promise<ResponseData> {
  // 实际的API请求逻辑
  // 例如:return await axios.post('/api/submit', data);
}

function YourComponent() {
  // 使用自定义Hook
  const { loading, error, handleSubmit } = useSubmitWithLoading(submitRequest);

  // 处理表单提交
  const handleFormSubmit = async (event: FormEvent) => {
    event.preventDefault();
    // 假设你要提交的数据
    const dataToSubmit = {/* ... */};
    try {
      await handleSubmit(dataToSubmit);
      // 处理成功的情况
    } catch {
      // 错误已经被设置,可以在这里进一步处理或显示
    }
  };

  return (
    <form onSubmit={handleFormSubmit}>
      {/* ...你的表单元素... */}
      <button type="submit" disabled={loading}>
        {loading ? 'Submitting...' : 'Submit'}
      </button>
      {error && <div>Error: {error.message}</div>}
    </form>
  );
}

export default YourComponent;

在这个组件中,我们使用了useSubmitWithLoading Hook来处理表单的提交事件。当用户点击提交按钮时,handleFormSubmit会被调用,它会进一步调用handleSubmit。在请求进行时,按钮会显示加载状态并被禁用以防止重复提交。如果发生错误,它会被捕获并可以在组件中显示。

请记住,这只是一个基本的例子。在实际应用中,你可能需要根据你的API和组件逻辑做进一步的调整,比如处理请求成功后的状态更新和错误处理。

相关推荐
我命由我1234525 分钟前
微信小程序 - 自定义实现分页功能
前端·微信小程序·小程序·前端框架·html·html5·js
程序员黄同学1 小时前
请谈谈 Vue 中的 key 属性的重要性,如何确保列表项的唯一标识?
前端·javascript·vue.js
繁依Fanyi1 小时前
巧妙实现右键菜单功能,提升用户操作体验
开发语言·前端·javascript·vue.js·uni-app·harmonyos
前端御书房1 小时前
前端防重复请求终极方案:从Loading地狱到精准拦截的架构升级
前端·javascript
web182854825121 小时前
nginx 部署前端vue项目
前端·vue.js·nginx
zy0101011 小时前
HTML标签
前端·css·html
程序员黄同学1 小时前
解释 Vue 中的虚拟 DOM,如何通过 Diff 算法最小化真实 DOM 更新次数?
开发语言·前端·javascript
蓝谷芮济2 小时前
二:前端发送POST请求,后端获取数据
前端
果粒chenl2 小时前
css+js提问
前端·javascript·css
memorycx2 小时前
Vue02
前端·javascript·vue.js