前端在项目中使用mockjs模拟数据的增删改查

news2025/7/18 17:56:22

背景

在项目开发时,会存在前端界面已经画好了但是后端接口还在开发的情况,此时前端可以先根据接口文档明确自己需要的字段,然后使用mock模拟后端接口进行调试

安装

npm install mockjs

使用

1. 创建vue项目之后,新建一个mock文件夹,定义一个index.js文件

2. 引入mock依赖,使用setup方法设置请求响应的时间

// index.js

// 导入mockjs 返回一个对象
const Mock = require('mockjs')

// 使用setup配置请求的响应时间,单位是毫秒
Mock.setup({
  // timeout: 1000 // 意味着接口1s后返回
  timeout: '200-1000' // 意味这接口响应时间介于200毫秒-1s之间
})

3. Mock对象中有个mock方法生成响应的数据

// index.js
// 根据Mock.mock方法生成响应的数据
// Mock.mock( rurl请求的url, rtype请求的类型, template数据模板| function( options ) 生成响应数据的函数)
/*
    一般数据模板传递的对象:
    {
        "key|生成规则": 响应的数据
    }
    
    生成的规则
    m-n    生成m到n个
    +n     每生成一次 数值都+1
*/

// 普通的示例
// 请求list接口,返回1-10条之间的数据,返回的结构是{ code: 0, data: [{},{}...]}
Mock.mock('/list', 'get', {
  code: 0,
  ...{ 'data|1-10': [{}] }
})

4. 在main.js中 引入mock文件夹下的index文件

// main.js

...
import '@/mock/index'

 5. 在需要使用接口的地方,用axios请求对应的接口地址即可获取数据

// Home.vue

async mounted () {
  const res = await axios.get('/list')
  console.log(res, 'resres')
}

打印出来的结果

常用的数据占位符

下面例举一些项目上常用的数据占位符,能快速随机生成数据结构

使用@string可以生成随机的字符串
@string(length) 可以输入数字指定长度
@string("lower|upper|number|symbol",length)  第一个参数可以指定是字母小写|大写|数字|符号,第二个参数可以输入数字指定长度
@string(min, max)  可以指定字符串的区间
eg:{ 'data|1-10': [{ 'id|+1': 1, name: '@string' }] }


使用@boolean可以生成随机的布尔值 true|false
eg:{ 'data|1-10': [{ 'id|+1': 1, sex: '@boolean' }] }


使用@integer随机生成一串数字
Random.integer( min, max )
eg:{ 'data|1-10': [{ 'id|+1': 1, count: '@integer(1, 20)' }] }


使用@date随机生成日期
@date("yyyy-MM-dd") "2022-11-28"
@date("yy-MM-dd")  22-11-28
eg:{ 'data|1-10': [{ 'id|+1': 1, date: '@date(yyyy-MM-dd)' }] }


使用@time随机生成时分秒
@time("HH:mm:ss") "00:15:29" 常用的是这个格式
eg:{ 'data|1-10': [{ 'id|+1': 1, time: '@time(HH:mm:ss)' }] }


使用@datetime 随机生成具体的日期至时分秒
@datetime("yyyy-MM-dd HH:mm:ss") "2018-11-29 09:25:16" 常用的是这个格式
eg:{ 'data|1-10': [{ 'id|+1': 1, time: '@datetime(yyyy-MM-dd HH:mm:ss)' }] }


使用@image 随机生成具体大小的图片
@image( size?, background?, foreground?, format?, text? )
可以指定图片的尺寸,底色,文案的颜色,图片的格式,图片上的文案展示
eg:{ 'data|1-10': [{ 'id|+1': 1, image: '@image' }] }
eg:{ 'data|1-10': [{ 'id|+1': 1, image: '@image(200x100, #50B347, #fff, hello)' }] }


使用@cparagraph 随机生成段落文案--中文
@cparagraph( min?, max? ) 可以指定生成多少句文案
eg:{ 'data|1-10': [{ 'id|+1': 1, cparagraph: '@cparagraph(2)' }] }


使用@ctitle 随机生成标题--中文
@ctitle( length ) 可以指定标题的长度
@ctitle( min, max ) 可以指定标题的长度的区间
eg:{ 'data|1-10': [{ 'id|+1': 1, title: '@ctitle(10)' }] }


使用@cname 随机生成姓名-中文
eg:{ 'data|1-10': [{ 'id|+1': 1, name: '@cname' }] }


使用@email 随机生成邮箱地址
eg:{ 'data|1-10': [{ 'id|+1': 1, email: '@email' }] }


使用@province 随机生成省份
eg:{ 'data|1-10': [{ 'id|+1': 1, province: '@province' }] }


使用@province 随机生成省份
使用@city 随机生成城市 @city(true) 则会把省份也显示出来
使用@county 随机生成地级  @county(true) 则会把省、市前缀显示出来
eg:{ 'data|1-10': [{ 'id|+1': 1, province: '@province' }] }
eg:{ 'data|1-10': [{ 'id|+1': 1, city: '@city' }] }
eg:{ 'data|1-10': [{ 'id|+1': 1, county: '@county' }] }


使用@pick 随机生成指定的范围数据
eg:{ 'data|1-10': [{ 'id|+1': 1, role: '@pick(["董事长", "总监", "经理", "组长"])' }] }

通过extend可以拓展mockjs的属性

随机生成手机号码

Mock.Random.extend({
  phone () {
    // 自己随便写前缀
    const phonePrefixs = ['135', '189', '136']
    // 使用pick 随机返回前缀
    return this.pick(phonePrefixs) + Mock.mock(/\d{8}/)
  }
})
console.log(Mock.Random.phone())

mockjs的综合使用-----增删改查

模拟获取列表数据 get

// mock/index.js

// 常用的表格数据结构
const list = Mock.mock({
  'data|10': [{ // 生成10条数据
    'id|+1': 1, // id会自增
    name: '@cname', // 随机生成姓名 --中文名
    sex: '@integer(0, 1)', // 性别一般是用数字表示 0男生 1女生
    phone: Mock.Random.phone(), // 拓展mockjs 生成随机的手机号码
    email: '@email', // 随机生成邮箱地址
    account: '@name', // 随机生成账号名 -- 英文
    status: '@boolean', // 随机生成布尔值 表示账户状态
    profile: '@image( 50x50, #FF6600, #fff, png, 头像 )', // 随机生成头像
    createTime: '@datetime(yyyy-MM-dd HH:mm:ss)', // 随机生成创建时间
    role: '@pick(["董事长", "总监", "经理", "组长"])' // 随机生成角色
  }]
})
Mock.mock('/list', 'get', {
  code: 0,
  ...list,
  total: 10
})

在需要获取列表的页面请求接口

async mounted () {
    const res = await axios.get('/list')
    console.log(res, '===>getList')
}

打印查询列表的数据结果

模拟根据id查询对应数据 get

// mock/index.js

// 使用响应数据的函数,含有 url、type 和 body 三个属性
// 根据url 获取参数
Mock.mock(/listById/, 'get', ({ url }) => {
  // 获取?后面的参数
  const query = url.split('?')[1]
  // 解析参数
  const queryStr = new URLSearchParams(query)
  const id = queryStr.get('id')
  return {
    code: 0,
    data: list.data.find(item => item.id === Number(id))
  }
})

在需要获取列表的页面请求接口

methods: {
  async getDetailById () {
      const res = await axios.get('listById', { params: { id: 1 } })
      console.log(res, '===>getDetailById')
    }
  }

打印查询的结果

模拟增加数据 post

// mock/index.js

// 如果是put | post 的请求 参数是放在了body里面
Mock.mock(/addItem/, 'post', ({ body }) => {
  // 获取请求体的数据
  const { data } = JSON.parse(body)
  // 对一些必填的字段做校验
  const dataTips = {
    name: '名字不能为空',
    sex: '性别不能为空',
    phone: '手机号码不能为空',
    account: '账号不能为空'
  }
  for (const key of Object.keys(dataTips)) {
    if (!data[key]) {
      return { code: 500, message: dataTips[key] }
    }
  }
  return { code: 0, data: '操作成功' }
})

在需要增加数据的的页面请求接口

methods: {
    async addItem () {
        const params = {
            name: 'lily',
            sex: '女'
        }
        const res = await axios.post('/addItem', { data: params })
        console.log(res, '===>addItem')
    }
}

打印的结果

methods: {
    async addItem () {
        const params = {
            name: 'lily',
            sex: '女',
            phone: '15915888888',
            account: 'aaa.com'
        }
        const res = await axios.post('/addItem', { data: params })
        console.log(res, '===>addItem')
    }
}

模拟根据id删除对应数据 delete

// mock/index.js

Mock.mock(/removeById/, 'delete', ({ url }) => {
  // 获取?后面的参数
  const query = url.split('?')[1]
  // 解析参数
  const queryStr = new URLSearchParams(query)
  const id = queryStr.get('id')
  const index = list.data.findIndex(item => item.id === id)
  list.data.splice(index, 1)
  return {
    code: 0,
    data: '操作成功'
  }
})

在需要删除数据的页面请求接口

methods: {
    async removeItemlById () {
      const res = await axios.delete('/removeById', { params: { id: 1 } })
      console.log(res, '===>removeItemlById')
    }
  }

打印删除的结果

模拟根据id修改对应数据  put

// mock/index.js

// 如果是put | post 的请求 参数是放在了body里面
Mock.mock(/updateById/, 'put', ({ body }) => {
  // 格式化body的参数
  const { data } = JSON.parse(body)
  // 找到对应的数据
  const target = list.data.find(item => item.id === data.id)
  if (!target) {
    return { code: 500, message: '查询有误' }
  }
  for (const key in data) {
    target[key] = data[key]
  }
  return { code: 0, data: target }
})

在需要修改数据的页面请求接口

methods: {
    async updatetemlById () {
      const res = await axios.put('/updateById', { data: { id: 1, name: '我是修改的名字', role: '我是修改的role', account: '我是修改的账号' } })
      console.log(res, '===>updatetemlById')
    }
  }

打印修改后的结果

~~~end~~~

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

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

相关文章

基于SpringBoot的校园疫情防控系统设计与实现

1.概述 校园疫情防控系统的开发运用java技术、springboot框架,MIS的总体思想,以及Mysql等技术的支持下共同完成了该系统的开发,实现了校园疫情防控管理的信息化,使用户体验到校园疫情防控管理,管理员管理操作将更加方…

使用 el-table 实现树形数据懒加载、点击行展开、每次只展示一条数据(大类)以及自定义表格合计值

1. 使用 el-table 实现树形数据懒加载 实现必需条件: lazy :load“loadNode” :tree-props“{ children: ‘children’, hasChildren: ‘hasChildren’ }” 注意:特别是第3条,后端接口必须传给你"hasChildren"(名字可以不一样)…

Vue3的vue-router超详细使用

从零开始搭建Vue3环境(vitetsvue-router),手拉手做一个router项目搭建vue3环境vue-router入门(宝宝模式)vue-router基础(青年模式)一。动态路由匹配1.带参数的动态路由匹配2.捕获所有路由或404 …

uniapp项目中引入vant-Weapp(局部全局都有 史上最详细的方法)

1.先在根目录创建wxcomponents文件夹 2.打开 https://github.com/youzan/vant-weapp 下载最新的vant-Weapp 3.把我们下好的文件vant-weapp里面只留下dist其余的可以全部删掉,然后把vant-weapp放到 wxcomponents里面 4.在App.vue引入vant样式 import /wxcomponents…

蓝桥杯web开发-5道模拟题让你信心满满

📋 个人简介 💖 作者简介:大家好,我是阿牛,全栈领域新星创作者。😜📝 个人主页:馆主阿牛🔥🎉 支持我:点赞👍收藏⭐️留言&#x1f4d…

最好的Vue组件库之Vuetify的入坑指南(持续更新中)

目录 安装Vuetify 文档结构 快速入门 特性 样式和动画 首先先声明,个人不是什么很牛逼的大佬,只是想向那些想入坑Vuetify的前端新手或者嫌文档太长不知如何入手的人提供一些浅显的建议而已,能让你们稍微少走一些弯路就是本文的目的。我其实也…

『从零开始学小程序』媒体组件video组件

👨‍🎓作者简介:一位喜欢写作,计科专业大三菜鸟 🏡个人主页:starry陆离 🕒首发日期:2022年9月15日星期四 如果文章有帮到你的话记得点赞👍收藏💗支持一下哦 『…

Vue结合高德地图实现HTML写自定义信息弹窗

最近在写项目的时候有个需求就是根据点击地图上的点展示对应的信息,弹窗看着还挺花哨的。我在高德地图官网上还有各大平台找了如何自定义弹窗,可给出的大多数都是通过JS写HTML结构,我感觉这种不仅不好布局,而且可读性和维护性都不…

客户端会话跟踪技术 Cookie 浅谈

文章目录前言为什么之前浏览器和服务器不支持数据共享?会话跟踪技术Cookie的概念Cookie的工作流程Cookie的基本使用Cookie原理分析Cookie的存活时间Cookie存储中文前言 用户打开浏览器,第一次访问 Web 服务器资源时,会话建立,直到…

富文本编辑器Quill 介绍及在Vue中的使用方法

在Web开发中,富文本编辑器是不可或缺的一个功能组件,掌握少量基础语法就能让一篇文章实现较为不错的排版效果,即见即所得。 目前市场上已提供大量集成富文本编辑器的包,Quill 作为其中一个,以简单、易上手特点&#x…

vue项目打包失败问题记录

项目"vue": "^2.7.14"版本 起因:项目里安装了openlayers最新版本的地图插件,打包会成功,但是打包页面会有红色提示 刚开始根据红色提示百度找到相同错误的方法提供了的一系列提示安装啊,卸载,装了…

【WebSocket 协议】Web 通信的下一步进化

标题【手动狗头🐶】,大佬轻饶 目录一、什么是 WebSocket ?二、WebSocket 应用场景?三、代码中的 WebSocket四、一个完美的案例:在线聊天程序实现服务器chat/index.js实现客户端chat/index.htmlchat/style.css最终效果WebSocket 是基于单个 …

关于elementUI表单的清除验证以及复合型输入框

目录 一、清除表单的验证 问题的发生以及解决过程 代码 总结 二、复合型输入框——查询(前置和后置都有的) 问题的发生以及解决过程 代码 展示 一、清除表单的验证 问题的发生以及解决过程 表单弹窗关闭后再打开会出现上一次的验证信息提示&am…

JS中如何判断一个值是否为Null

前言 在鉴别JavaScript原始类型的时候我们会用到typeof操作符。Typeof操作符可用于字符串、数字、布尔和未定义类型。但是你运行typeof null时,结果是“object”(在逻辑上,你可以认为null是一个空的对象指针,所以结果为“object”)。 如何判…

Vue3【计算属性、Class绑定、Style绑定 、侦听器、表单输入绑定、模板引用、组件注册方式、组件嵌套关系 、组件注册方式】(三)-全面详解(学习总结---从入门到深化)

👏作者简介:大家好,我是小童,Java开发工程师,CSDN博客博主,Java领域新星创作者 📕系列专栏:前端、Java、Java中间件大全、微信小程序、微信支付、若依框架、Spring全家桶 &#x1f4…

一个小项目带你了解vue框架——TodoList(简单实用易上手)

写在前面 你是否还在为繁杂的事情感到头昏脑涨?你是否还在将便利贴贴满整个桌面?本文就为你解决这个烦恼,使用vue框架做一个TodoList,将事情整理的井井有条不再是一个遥不可及梦!让我们行动起来吧! 基于vue…

解决前端项目问题,uniapp运行微信开发工具小程序,出现× initialize报错,以及浏览器无法运行

项目场景: uniapp进行小程序以及多端web页面都不知道如何配置讲项目运行起来。 就会报出无法运行错误。 [微信小程序开发者工具] - initialize [微信小程序开发者工具] [微信小程序开发者工具] IDE may already started at port , trying to connect如图 问题描…

微信小程序前端解密获取手机号

微信小程序在获取用户手机号时安全正确的做法是把获取的iv等信息传递给后端&#xff0c;让后端解密&#xff0c;再提供接口返回给前端。 但是遇到一下比较一般的后端或者懒的后端的话&#xff0c;前端也可以考自己完成手机号解密。 1.使用授权手机号组件按钮 <view class&…

【Vue】Cannot set reactive property on undefined,null,or primitive value:undefined

一、背景描述技术栈&#xff1a;vue element报错内容&#xff1a;Cannot set reactive property on undefined, null, or primitive value:undefined如下图所示&#xff1a;二、报错原因根据报错内容翻译一下&#xff0c;就是不能对 undefined,null 或者原始值为 undefined 的…

uniapp中怎么使用easycom 自定义组件

一、全局注册 uni-app 支持配置全局组件&#xff0c;需在 main.js 里进行全局注册&#xff0c;注册后就可在所有页面里使用该组件。 Vue.component 的第一个参数必须是静态的字符串。nvue 页面暂不支持全局组件。 二、局部注册 局部注册之前&#xff0c;在需要引用该组件的…