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和组件逻辑做进一步的调整,比如处理请求成功后的状态更新和错误处理。

相关推荐
dllxhcjla几秒前
css第二天
java·前端·css
码农刚子10 分钟前
ASP.NET Core Blazor 核心功能二:Blazor表单和验证
前端·html
BBB努力学习程序设计12 分钟前
细线表格:打造优雅的数据展示界面
前端·html
前端老宋Running12 分钟前
为什么react~Hooks只能在组件最顶层调用
前端·react.js·面试
Asort12 分钟前
React类组件精要:定义机制与生命周期方法进阶教程
前端·javascript·react.js
祈祷苍天赐我java之术14 分钟前
SpringCache :让缓存开发更高效
前端·spring·bootstrap
Tonyzz15 分钟前
开发编程进化论:openspec的魔力
前端·ai编程·vibecoding
undefined在掘金3904116 分钟前
Flutter应用图标生成插件flutter_launcher_icons的使用
前端
快手技术23 分钟前
从“拦路虎”到“修路工”:基于AhaEdit的广告素材修复
前端·算法·架构
weixin_4386943932 分钟前
pnpm 安装依赖后 仍然启动报的问题
开发语言·前端·javascript·经验分享