vue 使用mock模拟数据

news2024/9/29 9:32:09

vue 使用mock模拟数据

  1. 安装依赖
cnpm install axios --save
cnpm install mockjs --save-dev
cnpm install json5 --save-dev
  1. 在根目录下,新建一个mock文件,且创建如下文件
    在这里插入图片描述

    • utils.js
      在这里插入图片描述

    • index.js

const Mock = require('mockjs')
const { param2Obj } = require('./utils')
// 模拟的数据接口
const home = require('./home')

const mocks = [
  ...home,
]
function mockXHR() {
  Mock.XHR.prototype.proxy_send = Mock.XHR.prototype.send
  Mock.XHR.prototype.send = function() {
    if (this.custom.xhr) {
      this.custom.xhr.withCredentials = this.withCredentials || false

      if (this.responseType) {
        this.custom.xhr.responseType = this.responseType
      }
    }
    this.proxy_send(...arguments)
  }

  function XHR2ExpressReqWrap(respond) {
    return function(options) {
      let result = null
      if (respond instanceof Function) {
        const { body, type, url } = options
        result = respond({
          method: type,
          body: JSON.parse(body),
          query: param2Obj(url)
        })
      } else {
        result = respond
      }
      return Mock.mock(result)
    }
  }

  for (const i of mocks) {
    Mock.mock(new RegExp(i.url), i.type || 'get', XHR2ExpressReqWrap(i.response))
  }
}

module.exports = {
  mocks,
  mockXHR
}


  • mock-server.js
const chokidar = require('chokidar')
const bodyParser = require('body-parser')
const chalk = require('chalk')
const path = require('path')
const Mock = require('mockjs')

const mockDir = path.join(process.cwd(), 'mock')

function registerRoutes(app) {
  let mockLastIndex
  const { mocks } = require('./index.js')
  const mocksForServer = mocks.map(route => {
    return responseFake(route.url, route.type, route.response)
  })
  for (const mock of mocksForServer) {
    app[mock.type](mock.url, mock.response)
    mockLastIndex = app._router.stack.length
  }
  const mockRoutesLength = Object.keys(mocksForServer).length
  return {
    mockRoutesLength: mockRoutesLength,
    mockStartIndex: mockLastIndex - mockRoutesLength
  }
}

function unregisterRoutes() {
  Object.keys(require.cache).forEach(i => {
    if (i.includes(mockDir)) {
      delete require.cache[require.resolve(i)]
    }
  })
}

// for mock server
const responseFake = (url, type, respond) => {
  return {
    url: new RegExp(`${process.env.VUE_APP_BASE_API}${url}`),
    type: type || 'get',
    response(req, res) {
      console.log('request invoke:' + req.path)
      res.json(Mock.mock(respond instanceof Function ? respond(req, res) : respond))
    }
  }
}

module.exports = devServe => {
  var app = devServe.app
  // parse app.body
  // https://expressjs.com/en/4x/api.html#req.body
  app.use(bodyParser.json())
  app.use(bodyParser.urlencoded({
    extended: true
  }))

  const mockRoutes = registerRoutes(app)
  var mockRoutesLength = mockRoutes.mockRoutesLength
  var mockStartIndex = mockRoutes.mockStartIndex

  // watch files, hot reload mock server
  chokidar.watch(mockDir, {
    ignored: /mock-server/,
    ignoreInitial: true
  }).on('all', (event, path) => {
    if (event === 'change' || event === 'add') {
      try {
        // remove mock routes stack
        app._router.stack.splice(mockStartIndex, mockRoutesLength)

        // clear routes cache
        unregisterRoutes()

        const mockRoutes = registerRoutes(app)
        mockRoutesLength = mockRoutes.mockRoutesLength
        mockStartIndex = mockRoutes.mockStartIndex

        console.log(chalk.magentaBright(`\n > Mock Server hot reload success! changed  ${path}`))
      } catch (error) {
        console.log(chalk.redBright(error))
      }
    }
  })
}

  1. 定义mock的数据

在 Vue 中使用 mock 进行接口模拟数据时,接口路径中的 .* 是一个正则表达式的匹配规则,表示该路径可以匹配任意字符(包括字母、数字、特殊字符等)。

通常情况下,.* 用于模拟具有动态参数的接口路径。例如,假设你的接口路径为 /api/user/:id,其中的 :id 表示一个动态参数,可以是任意字符。为了模拟这样的接口,你可以使用 /api/user/.* 来匹配任意字符的请求路径。

通过使用正则表达式的匹配规则 .*,你可以实现更加灵活的接口模拟,并根据不同的请求路径返回对应的模拟数据。

  • mock/home.js
const Mock = require('mockjs')
module.exports = [

  {
    url: '/api/user/.*',
    type: 'get',
    response: config => {
        const id = config.url.split('/').pop();
      let info
      // 根据动态参数返回不同的模拟数据
      if (id == '1') {
        info = {name: 'Alice' };
      } else if (id == '2') {
        info = {name: 'Bob' };
      } else {
        info = {name: 'Unknown' };
      }
      return {
        code: 200,
        data: info
      }
    }
  },

  {
    url: '/api/users/info',
    type: 'get',
    response: config => {
      return Mock.mock({
        code: 200,
        message: '处理成功',
        data: {
          userName:'@cname()',
          id: "@id()"
        },
      })
    }
  }
]
  1. 在vue.config.js文件中使用mock数据
    在这里插入图片描述

  2. 在vue页面调用

<script>
import axios from "axios"
export default {
  methods:{
    async getUserInfo() {
      let res = await axios.get("/api/users/info");
       console.log(res.data);
    },
    async getUserInfoById() {
      let res = await axios.get("/api/user/1");
       console.log(res.data);
    }
  }
</script>

其他配置

使用npm run serve:stage才调用mock数据,同理部署时打包命令为npm run build:stage为模拟数据

  • 在main.js中
if (process.env.NODE_ENV === 'stage') {
  const { mockXHR } = require('../mock')
  mockXHR()
}
  • package.json
   "serve:stage": "vue-cli-service serve --mode stage",
   "build:stage": "vue-cli-service build --mode stage",
  • .env.stage
NODE_ENV = stage
# just a flag
ENV = 'stage'
VUE_APP_DEV_BASE_API= ''
VUE_APP_REQUEST_URL='https://xxxx'

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1386662.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

C++ 数组分页,经常有用到分页,索性做一个简单封装 已解决

在项目设计中&#xff0c; 有鼠标滑动需求&#xff0c;但是只能说能力有限&#xff0c;索性使用 php版本的数组分页&#xff0c;解决问题。 经常有用到分页&#xff0c;索性做一个简单封装、 测试用例 QTime curtime QTime::currentTime();nHour curtime.hour();nMin curtim…

PTA-7-4 堆排序

代码如下: #include<iostream> using namespace std; void change(int arr[], int n, int i); int main() {int n,i,end,arr[1000];cin >> n;for (i 0; i < n; i){cin >> arr[i];}//进行一次排序,把最大值放到顶端for (i n/2-1; i > 0; i--){change…

如何去开发直播电商系统小程序

明确你的直播电商系统的功能和特性&#xff0c;包括用户注册、商品展示、购物车、支付结算、直播功能、评论互动等。根据需求确定系统的基本架构和主要模块。 技术选型&#xff1a;选择适合你的直播电商系统的技术栈。考虑前端框架&#xff08;如React、Vue.js&#xff09;、后…

Python中的多种“占位符”和用法解析

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 在Python编程中&#xff0c;经常需要在字符串中插入变量或占位符来构建动态的文本内容。Python提供了多种方式来实现这一目标&#xff0c;本文将介绍常见的“占位符”及其用法&#xff0c;包括字符串格式化、f-s…

开源ERP系统Odoo安装部署并结合内网穿透实现公网访问本地系统

文章目录 前言1. 下载安装Odoo&#xff1a;2. 实现公网访问Odoo本地系统&#xff1a;3. 固定域名访问Odoo本地系统 前言 Odoo是全球流行的开源企业管理套件&#xff0c;是一个一站式全功能ERP及电商平台。 开源性质&#xff1a;Odoo是一个开源的ERP软件&#xff0c;这意味着企…

Elasticsearch添加7.17.10IK分词器

Elasticsearch添加7.17.10IK分词器 在https://github.com/medcl/elasticsearch-analysis-ik/tree/7.x中未找到7.17.10版本的发布版本&#xff0c;如歌ik版本和Elasticsearch版本不同安装后无法启动。所以下载git上的源代码&#xff0c;并手动编译指定版本IK分词器。 &#xff…

跨境电商账号频繁?你的IP可能“不干净”了

疫情促进了跨境电商行业的加速发展&#xff0c;许多卖家也抓住了这波流量红利&#xff0c;跨境电商月入数万&#xff0c;数十万甚至数百万的造福神话也不断在上演&#xff0c;但由于国内外电商运营模式不同&#xff0c;多店运营、用户数据收集、刷单等行为都受到了国外平台的严…

赴美生子月子机构要怎么选?

首先&#xff0c;了解月子机构的背景和信誉度非常重要。查看机构是否合法注册&#xff0c;是否有任何不良记录或投诉。通过与机构的交流和与其他妈妈.的口碑推.荐&#xff0c;了解机构的信誉和口碑。 要选择正规的赴美生子机构。这个很重要哦!正规的机构要有合法的执照&#x…

上海市税务局:买卖虚拟货币需缴税!中国仍未有放松加密政策的迹象?

自2021年央行等十部委下发禁止虚拟货币交易的通知以来&#xff0c;国内虚拟货币交易平台几乎销声匿迹。然而&#xff0c;最近一则关于个人所得税的释义再次引起了人们的关注。 1月5日&#xff0c;国家税务总局上海市税务局在官方公众号发布《个人所得税经营所得和分类所得常见误…

python基础语法看一篇就够了,全网最全python语法笔记汇总

前言 Python 是一种代表简单思想的语言&#xff0c;其语法相对简单&#xff0c;很容易上手。不过&#xff0c;如果就此小视 Python 语法的精妙和深邃&#xff0c;那就大错特错了。 如能在实战中融会贯通、灵活使用&#xff0c;必将使代码更为精炼、高效&#xff0c;同时也会极…

跳马 - 华为OD统一考试

OD统一考试(C卷) 分值: 200分 题解: Java / Python / C++ 题目描述 马是象棋(包括中国象棋只和国际象棋)中的棋子,走法是每步直一格再斜一格,即先横着或直着走一格,然后再斜着走一个对角线,可进可退,可越过河界,俗称马走 “日“ 字。 给项m行n列的棋盘(网格图),棋…

《剑指 Offer》专项突破版 - 面试题 13 : 二维子矩阵的数字之和(C++ 实现)- 二维前缀和

题目链接&#xff1a;LCR 013. 二维区域和检索 - 矩阵不可变 - 力扣&#xff08;LeetCode&#xff09; 题目&#xff1a; 输入一个二维矩阵&#xff0c;如何计算给定左上角坐标和右下角坐标的子矩阵的数字之和&#xff1f;对于同一个二维矩阵&#xff0c;计算子矩阵的数字之和…

rocketmq实现延迟队列思路探讨

大家好&#xff0c;我是了不起&#xff0c;专为小白解决痛点的了不起。 一、非任意时间 1、修改 在服务器端&#xff08;rocketmq-broker端&#xff09;的属性配置文件中加入以下行&#xff1a; messageDelayLevel1s 5s 10s 30s 1m 2m 3m 4m 5m 6m 7m 8m 9m 10m 20m 30m 1h 2h …

【HarmonyOS4.0】第十一篇-ArkUI布局容器组件(三)

五、格栅布局容器 GridContainer纵向排布栅格布局容器&#xff0c;仅在栅格布局场景中使用。该组件不再维护&#xff0c;推荐使用新组件GridCol、GridRow。 5.1.栅格容器GridRow 栅格容器组件&#xff0c;仅可以和栅格子组件(GridCol)在栅格布局场景中使用。 5.1.1.接口 G…

时光机启动:Spring中如何巧妙实现定时任务?

嗨&#xff0c;亲爱的小伙伴们&#xff01;小米在这里又来和大家分享一些技术干货啦&#xff01;今天我们要探讨的话题是关于Spring框架中如何实现定时任务。对于我们这些热爱技术的小伙伴来说&#xff0c;定时任务可是一个非常有趣而且实用的话题哦&#xff01; 引子 首先&a…

使用emu8086实现——子程序的设计

一、实验目的 学习子程序的结构、特点&#xff0c;以及子程序的设计和调试方法 二、实验内容 1、从字符串中删除一个字符&#xff0c;并存储到寄存器AX中。 代码及注释&#xff1a; data segmentstring db exas ;字符串内容leng dw $-string ; 字符串长度key db x …

js简单原生实现

JavaScript实现 这是一篇用JavaScript技术实现各种效果的学习贴&#xff0c;赋各种代码&#xff0c;供参考&#xff01; 1.按钮事件 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-…

Flink 处理函数(1)—— 基本处理函数

在 Flink 的多层 API中&#xff0c;处理函数是最底层的API&#xff0c;是所有转换算子的一个概括性的表达&#xff0c;可以自定义处理逻辑 在处理函数中&#xff0c;我们直面的就是数据流中最基本的元素&#xff1a;数据事件&#xff08;event&#xff09;、状态&#xff08;st…

Github仓库使用方式

主要参考&#xff1a; 「详细教程」使用git将本地项目上传至Github仓库&#xff08;MacOS为例&#xff09;_github上传代码到仓库-CSDN博客 新建文件夹参考&#xff1a; GitHub使用指南——建立仓库、建立文件夹、上传图片详细教程-CSDN博客 一、新建一个 github 仓库&#…