当前位置: 首页 > news >正文

【react18】react项目使用mock模拟后台接口

前后端分离项目,后端还没有接口的时候,前端可以使用mockjs的技术实行假数据的模拟。这里使用的是mock的库msw实现这个业务.

MSW

msw是mock的工具,官网地址是在这里

使用步骤

1.安装msw

npm install msw@latest --save-dev

2.新建存放mock接口的文件夹

// src/mocks/handlers.js
import { http, HttpResponse } from 'msw'
 
export const handlers = [
  // Intercept "GET https://example.com/user" requests...
  http.get('/api/login', () => {
    // ...and respond to them using this JSON response.
    return HttpResponse.json({
      id: 'c7b3d8e0-5e0b-4b0f-8b3a-3b9f4b3d3b3d',
      firstName: 'John',
      lastName: 'Maverick',
    })
  }),
]

3.react项目的公共文件夹

npx msw init ./public

会生成一个文件,这个文件内容我们暂时可以不管它,进去看看也行,此时package.json文件变化了,增加了msw的配置项
在这里插入图片描述

4、配置入口加载方法

// src/mocks/browser.js
import { setupWorker } from 'msw/browser'
import { handlers } from './handlers'
 
export const worker = setupWorker(...handlers)

5.在入口文件里面加载mock的主方法

async function enableMocking() {
  if (process.env.NODE_ENV !== 'development') {
    return
  }
 
  const { worker } = await import('./mocks/browser')
 
  // `worker.start()` returns a Promise that resolves
  // once the Service Worker is up and ready to intercept requests.
  return worker.start()
}

当然,也可以不用动态import

import { worker  } from './mocks/browser'

if(process.env.NODE_ENV === 'development') {
  worker.start()
}

工程目录

在这里插入图片描述

测试

重启项目,然后在项目中调用我们配置的接口/api/login方法
在这里插入图片描述
这样,就是实现了前端假数据的模拟
在这里插入图片描述

请求封装方法

import axios, { AxiosRequestConfig } from "axios";
import { useRef, useState } from "react";
function useRequest<T>(url: string, config: AxiosRequestConfig) {
  const [data, setData] = useState<T | null>(null);
  const [loading, setLoading] = useState(false);
  const [error, setError] = useState(null);
  const controllerRef = useRef(new AbortController());

  const cancelRequest = () => {
    controllerRef.current.abort();
  };
  const fetchData = async () => {
    // 清除数据
    setData(null);
    setError(null);
    setLoading(false);
    try {
      setLoading(true);
      const response = await axios.request<T>({
        url,
        ...config,
        signal: controllerRef.current.signal,
      });
      setData(response.data);
      console.log("🚀 ~ fetchData ~ response:", response);
    } catch (error: any) {
      setError(error || "An error occurred");
    } finally {
      setLoading(false);
    }
  };

  return { data, loading, error, fetchData, cancelRequest };
}

export default useRequest;

项目演示地址: 移动商城

相关文章:

  • cmd命令查看电脑的CPU、内存、存储量
  • 简记_单片机硬件最小系统设计
  • 《金庸群侠传》游戏秘籍
  • 加载huggingface数据集报token无效错误解决方案
  • PhotoShop学习02
  • 代码随想录刷题day52|(二叉树篇)106.从中序与后序遍历序列构造二叉树
  • C++中将记录集的数据复制到Excel工作表中的CRange类CopyFromRecordset函数异常怎么捕获
  • 科技赋能,高端气膜料仓重塑储存新标准—轻空间
  • 32位汇编:MASM32环境搭建与汇编窗口程序
  • 基于Babylon.js的Shader入门之六:让Shader反射环境贴图
  • 第30周Java分布式入门 线程池
  • Docker镜像迁移方案
  • 在STM32F7上实现CAN总线收发队列
  • MongoDB 与 Elasticsearch 使用场景区别及示例
  • 在 React 中,组件之间传递变量的常见方法
  • C语言贪吃蛇实现
  • 判定字符是否唯一
  • 【网络】HTTP 和 HTTPS
  • Apache Tomcat RCE漏洞(CVE-2025-24813)
  • [Windows] Edge浏览器_134.0.3124.83绿色便携增强版-集成官方Deepseek侧边栏
  • 如何学习制作网站/网络科技公司骗了我36800
  • 合肥市网站建设/今日疫情最新数据
  • wordpress 菜单 导航/百度快照优化公司
  • 山东建设厅网站扫黑/临沂网站建设方案服务
  • 化妆品营销型网站模板/郑州网络推广哪个好
  • 简述网页制作的步骤/惠州seo博客