vue 使用mock模拟数据

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'
  • 13
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue项目中,可以使用mock.js来模拟数据请求。引用\[1\]中提到,mock.js可以在后端没有提供接口的情况下,自己模拟一个mock接口去请求,并且可以返回你希望得到的随机数据。这对于本地开发和演示项目非常有用。引用\[2\]中提到,使用mock.js可以完全本地化实现数据,方便前端人员定义接口数据,并且可以配合后台人员进行开发。在Vue项目中,可以通过引入mock.js并定义mock接口来模拟数据请求。例如,可以在一个mock文件夹中创建一个mock.js文件,然后在该文件中定义接口和返回的数据。在Vue组件中,可以通过发送请求来获取mock数据。引用\[3\]中给出了一个示例,展示了如何使用mock.js来请求获取.json文件的数据。在该示例中,首先引入了mock-request工具和项目的设置文件,然后定义了一个tableData函数来发送请求并获取数据。这样,你就可以在Vue项目中使用mock.js来模拟数据请求了。 #### 引用[.reference_title] - *1* [【Vue使用mock模拟数据](https://blog.csdn.net/ZHANGYANG_1109/article/details/124547442)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [vue本地模拟服务器请求mock数据](https://blog.csdn.net/liyoro/article/details/119616107)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值