vue3+vite+mock模拟数据,使用插件vite-plugin-mock踩坑
解决办法:在上述的问题文件中加上两句话即可,让vite识别require。3、在项目根目录下创建mock文件夹,并创建文件index.ts。2、在vite.confog.ts中进行配置。4、在src/main.ts中引入mock文件。(1)定义API方法。
·
1、安装依赖:
npm i mockjs vite-plugin-mock --save-dev
npm i axios
!!!注意一个坑!!!:使用了vite-plugin-mock插件的时候,直接使用(mock配置都已经配置好,使用时)会出现一个问题,问题如下:

解决办法:在上述的问题文件中加上两句话即可,让vite识别require

import { createRequire } from 'module'
const require = createRequire(import.meta.url)
2、在vite.confog.ts中进行配置
import { defineConfig } from 'vite'
import vue from '@vitejs/plugin-vue'
//mock模拟通道
import { viteMockServe } from 'vite-plugin-mock'
// https://vitejs.dev/config/
export default defineConfig({
plugins: [
vue(),
viteMockServe({
mockPath: './mock/',//设置模拟数据的存储文件夹
//@ts-ignore
supportTs: true,//是否读取ts文件模块
logger:true,//是否在控制台显示请求日志
localEnabled: true,//设置是否启用本地mock文件
prodEnabled:true//设置打包是否启用mock功能
})
]
})
3、在项目根目录下创建mock文件夹,并创建文件index.ts
//存放本地的mock文件
import mockjs from "mockjs";
import pkg from 'mockjs';
const { Random } = pkg;//这是mock生成数据的一种方式;不这样写,跑本地会出现关于require的问题
const { mock: Mock } = mockjs
/**
* 下面的数据生成,笔者使用了一种比较笨的方法,熟悉mock的同学可忽略-_-
*/
interface IInterface {
url: string,
method: string,
response:Function
}
//用户数据
const userArray: any = []
for (let i = 0; i < 10; i++){
userArray.push(mockjs.mock({
"name": Random.cname(), //随机生成中文名字
"age": Random.integer(18,40),//随机生成18-40的数字
"birth": Random.date()//随机生成年月日
}))
}
//商品数据
const goods: any = []
for (let i = 0; i < 10; i++) {
goods.push(mockjs.mock({
"name": Random.ctitle(),//随机生成标题
"price": Random.integer(11, 400),//随机生成11-400的数字
"sourceAddress": Random.county(true),//随机生成省市县级城市
"image": Random.image('100x100'),//随机生成100*100的图片
"num":Random.integer(1,100)//随机生成1-100的数字
}))
}
// 房屋数据搞多点,模拟前端的分页查询
const houses:any = [],
villageNo:number = 1
let id = 1
for (let i = 0; i < 30; i++) {
houses.push(
mockjs.mock({
id: id++,
energyNo: Random.string('number', 8), //供能户号
villageNo: villageNo, // 小区编号
villageName: '东方花园', // 小区名称
energyState: Number(Random.boolean()), // 供能状态 0:供能中;1:报停;
state: Random.integer(0, 2), // 房屋状态 0:正常;1:停用;2:删除
createBy: Random.name(), // 创建人
createTime: Random.datetime() // 创建时间
})
)
houses[i].users = []
for (let j = 0; j < Mock({ 'number|0-4': 0 }).number; j++) {
const mouth = Mock({
'number|1-12': 1
}).number
const day = Mock({
'number|1-30': 11
}).number
houses[i].users.push(
Mock({
username: Random.name(), // 户主名称
userNo:
'320924' +
String(
Mock({
'number|1980-2004': 1999
}).number
) +
(mouth < 10 ? '0' + mouth : String(mouth)) +
(day < 10 ? '0' + day : String(day)) +
Random.string('number', 4), // 户主身份证
userPhone: Random.string('number', 11), // 户主手机号
userState: Number(Random.boolean()) // 户主状态,0:正常,1:删除
})
)
}
}
// 用户数据,获取用户信息
const userInfo:any = {
firstName: Random.first(),
lastName: Mock('@last'),
avatar: Random.image('200x200', '#894FC4', '#FFF', 'png', '@')
}
const mock: Array<IInterface> = [ //这里应该是做拦截的方法api集合
//拦截获取数据的请求
{
url: '/api/getData',
method: 'get',
response: () => {
return {
status: 200,
message: 'success',
data: userArray
}
}
},
//拦截获取商品的请求
{
url: '/api/goods',
method: 'get',
response: () => {
return {
status: 200,
message: 'success',
data: goods
}
}
},
{
url: '/api/houses',
method: 'get',
response: (a) => {
console.log(a);// 结果为下图
const page = a.query.page,
size = a.query.size
// 总数
const total = Math.ceil(houses.length / size)
let res_data = null
if (page <= total) {
res_data = houses.slice((page - 1) * size, (page - 1) * size + size)
} else {
res_data = '没有数据了1'
}
return {
status: 200,
message: 'success',
data: res_data,
total
}
}
},
{
url: '/api/userInfo',
method: 'get',
response: ({ query }) => {
console.log(query)
return {
status: 200,
message: 'success',
data: userInfo
}
}
}
]
export default mock //暴露,以便在src/main.ts中引入
上述“a”打印的结果。

4、在src/main.ts中引入mock文件
import { createApp } from 'vue'
import './style.css'
import App from './App.vue'
import "../mock/index"
createApp(App)
.mount('#app')
5、使用axios获取本地mock数据:
(1)定义API方法
import axios from "axios";
const service = axios.create({
baseURL: "/",
timeout:20000
})
export const getData = (params?:any) => {
return service({
url: "/api/getData",
method: "get",
params
})
}
export const getGoods = (params?: any) => {
return service({
url: "/api/goods",
method: "get",
params
})
}
(2)在页面中使用
<script setup lang="ts">
// import HelloWorld from './components/HelloWorld.vue'
import { ref } from "vue";
interface IGoods {
num: number,
price: number,
sourceAddress: string,
name: string,
image: string
}
let goods1 = ref<Array<IGoods>>([])
//调用mockapi
import { getData, getGoods } from "./api/index"
const getList = (params?: any) => {
getData(params).then((res: any) => {
console.log(res)
})
}
const goods = () => {
getGoods().then(res => {
console.log(res)
goods1.value = res.data.data
console.log(goods1)
})
}
</script>
<template>
<van-button type="danger" @click="getList">获取数据</van-button>
<van-button type="default" @click="goods">获取商品</van-button>
</template>
<style scoped></style>
6、实现的效果:
(1)点击获取数据按钮:

(2)点击获取商品按钮:

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐

所有评论(0)