Mock.js 基本语法与应用笔记

🌟 前言

欢迎来到我的技术小宇宙!🌌 这里不仅是我记录技术点滴的后花园,也是我分享学习心得和项目经验的乐园。📚 无论你是技术小白还是资深大牛,这里总有一些内容能触动你的好奇心。🔍

  • 🤖 洛可可白:个人主页

  • 🔥 个人专栏:✅前端技术 ✅后端技术

  • 🏠 个人博客:洛可可白博客

  • 🐱 代码获取:bestwishes0203

  • 📷 封面壁纸:洛可可白wallpaper

在这里插入图片描述

文章目录

  • Mock.js 基本语法与应用笔记
    • 1. Mock 基本语法
      • 生成指定字符
      • 生成随机字符
      • 生成标题和句子
      • 生成段落
      • 生成数字
      • 生成增量 ID
      • 身份证号、姓名、地址
      • 生成图片
      • 生成时间
      • 指定数组返回的长度和范围
    • 2. Mock 拦截请求
    • 3. Vue 中测试
    • 4. 另一种使用方式
    • 5. vite 项目
    • 🎉 往期精彩回顾

Mock.js 基本语法与应用笔记

Mock.js 是一个基于 JavaScript 的模拟数据生成库,它可以帮助开发者在前端开发过程中模拟后端API,提供测试数据。Mock.js 的主要功能是生成各种类型的模拟数据,包括文本、数字、日期、数组等,同时也支持拦截请求和响应,使得前端可以在不依赖后端API的情况下进行开发和测试。

1. Mock 基本语法

生成指定字符

import Mock from 'mockjs';

const data = Mock.mock({
    str: '🤣'
});

console.log(data);

指定字符和具体个数

const data = Mock.mock({
    'str|3': '🤣'
});

指定字符和区间

const data = Mock.mock({
    'str|3-5': '🤣'
});

生成随机字符

const data = Mock.mock({
    // 一串字母
    str: '@word'
    // 一个汉字
    // str: '@cword'
});

指定个数

const data = Mock.mock({
    // 3 个中文汉字
    'str|3': '@cword'
    // str: '@cword(3)'
});

指定区间

const data = Mock.mock({
    // 3 到 5 个中文字符
    'str|3-5': '@cword'
    // str: '@cword(3, 5)'
});

生成标题和句子

const data = Mock.mock({
    title: '@ctitle',
    sentence: '@csentence'
});

可以指定标题和句子的汉字长度和范围

// 长度
const data = Mock.mock({
    title: '@ctitle(3)',
    sentence: '@csentence(10)'
});
// 范围
const data = Mock.mock({
    title: '@ctitle(3, 5)',
    sentence: '@csentence(10, 15)'
});

生成段落

const data = Mock.mock({
    content: '@cparagraph'
});

指定段落的个数和范围

// 注意这里 3 代表的是 3 个段落,而不是 3 个中文字符
// 1 个句号是 1 段
const data = Mock.mock({
    content: '@cparagraph(3)'
});

生成数字

生成指定数字

const data = Mock.mock({
    // number: 20,
    // 如果是数值型的 value 将失去意义,最终都表示竖线右边的 20,一般写个 1
    'number|20': 1
});

生成数字区间

const data = Mock.mock({
    'number|1-10': 1
});

生成增量 ID

for (let i = 0; i < 10; i++) {
    const data = Mock.mock({
        // 默认 1,每次增加 1
        // id: '@increment'
        // 每次增加 10
        id: '@increment(10)'
    });
    console.log(data);
}

身份证号、姓名、地址

const data = Mock.mock({
    id: '@id',
    name: '@cname',
    address: '@city(true)'
});

生成图片

const data = Mock.mock({
    // 大小、背景色、前景色、格式、文字
    // 注意:颜色要是十六进制,不支持关键字,例如 red
    image: "@image('200x200', '#f00', '#fff', 'jpg', 'H')"
});

生成时间

const data = Mock.mock({
    time1: '@date', // 年-月-日
    time2: '@date("yyyy-MM-dd HH:mm:ss")'
});

指定数组返回的长度和范围

const data = Mock.mock({
    'list|1-3': [{
        name: '@cname',
        address: '@city(true)',
        id: '@increment(1)'
    }]
});

2. Mock 拦截请求

POST => /api/users

Mock.mock(/^\/api\/users/, 'post', (options) => {
    const user = JSON.parse(options.body);
    user.id = data.list.length ? data.list[data.list.length - 1].id + 1 : 1;
    data.list.push(user);
    return {
        status: 200
    };
});

DELETE => /api/users/:id

Mock.mock(/^\/api\/user\/.+/, 'delete', (options) => {
    const id = options.url.split('/').pop();
    // !注意 id 变成了字符串
    const idx = data.list.findIndex((item) => item.id === +id);
    data.list.splice(idx, 1);
    return {
        status: 200
    };
});

PUT => /api/users/:id

Mock.mock(/^\/api\/users\/.+/, 'put', (options) => {
    const user = JSON.parse(options.body);
    const idx = data.list.findIndex((item) => item.id === +user.id);
    data.list[idx] = user;
    return {
        status: 200
    };
});

GET => /api/users

Mock.mock(/^\/api\/user/, 'get', (options) => {
    const {
        pagenum,
        pagesize,
        query,
        id
    } = qs.parse(options.url.split('?')[1]);
    if (id) {
        const user = data.list.find((item) => item.id === +id);
        return {
            status: 200,
            user
        };
    }
    // 1 10   0 ~ 10
    // 2 10   10 ~ 20
    const start = (pagenum - 1) * pagesize;
    const end = pagenum * pagesize;
    const total = data.list.length;
    const totalPage = Math.ceil(data.list.length / pagesize);
    let list = [];
    if (pagenum > totalPage) {
        list = [];
    } else {
        list = data.list.slice(start, end);
    }
    return {
        status: 200,
        list,
        total
    };
});

GET => /api/users/:id

Mock.mock(/^\/api\/users\/.+/, 'get', (options) => {
    const id = options.url.split('/').pop();
    const user = data.list.find((item) => item.id === +id);
    return {
        status: 200,
        user
    };
});

3. Vue 中测试

User.vue

<template>
    <div class="users">
        <el-card class="box-card">
            <el-table :data="tableData" style="width: 100%">
                <el-table-column prop="date" label="日期" width="180" />
                <el-table-column prop="name" label="姓名" width="130" />
                <el-table-column prop="address" label="地址" width="180" />
                <el-table-column
                    fixed="right"
                    label="操作"
                    width="80"
                    align="right"
                >
                    <template slot-scope="scope">
                        <el-button
                            @click="deleteRow(scope.row)"
                            type="text"
                            size="small"
                        >
                            删除
                        </el-button>
                    </template>
                </el-table-column>
            </el-table>
            <el-pagination
                @size-change="handleSizeChange"
                @current-change="handleCurrentChange"
                :current-page="q.pagenum"
                :page-sizes="[5, 10, 15, 20]"
                :page-size="q.pagesize"
                layout="total, sizes, prev, pager, next, jumper"
                :total="total"
            >
            </el-pagination>
        </el-card>
    </div>
</template>

<script>
import axios from 'axios';
export default {
    data() {
        return {
            tableData: [],
            q: {
                pagenum: 1,
                pagesize: 5,
                query: ''
            },
            total: 0
        };
    },
    created() {
        this.getUsers();
    },
    methods: {
        async getUsers() {
            const {
                data: { list, total }
            } = await axios.get('/api/users', {
                params: this.q
            });
            this.tableData = list;
            this.total = total;
        },
        handleSizeChange(pagesize) {
            this.q.pagesize = pagesize;
            this.getUsers();
        },
        handleCurrentChange(pagenum) {
            this.q.pagenum = pagenum;
            this.getUsers();
        },
        async deleteRow({ id }) {
            const { data } = await axios.delete(`/api/user/${id}`)
            if (data.status === 200) {
                this.getUsers();
                this.$message.success('删除成功');
            }
        }
    }
};
</script>
<style>
.box-card {
    margin: 40px auto 0;
    width: 630px;
}
.clearfix:before,
.clearfix:after {
    display: table;
    content: '';
}
.clearfix:after {
    clear: both;
}
.el-pagination {
    margin-top: 15px;
}
</style>

4. 另一种使用方式

vue.config.js

const qs = require('querystring');
const Mock = require('mockjs');
const data = Mock.mock({
    'list|27': [
        {
            id: '@increment(1)',
            date: '@date(yyyy-MM-dd hh:mm:ss)',
            name: '@cname',
            address: '@city(true)'
        }
    ]
});
module.exports = {
    devServer: {
        before(app) {
            app.get('/api/users', (req, res) => {
                const { pagenum, pagesize, query } = qs.parse(
                    req.url.split('?')[1]
                );
                const start = (pagenum - 1) * pagesize;
                const end = pagenum * pagesize;
                const total = data.list.length;
                const totalPage = Math.ceil(data.list.length / pagesize);
                let list = [];
                if (pagenum > totalPage) {
                    list = [];
                } else {
                    list = data.list.slice(start, end);
                }
                res.send({
                    status: 200,
                    list,
                    total
                });
            });
            app.delete('/api/users/:id', (req, res) => {
                const idx = data.list.findIndex(
                    (item) => item.id === +req.params.id
                );
                data.list.splice(idx, 1);
                res.send({
                    status: 200
                });
            });
        }
    }
};

5. vite 项目

vite.config.js

import { defineConfig } from "vite";
import vue from "@vitejs/plugin-vue";
import { viteMockServe } from "vite-plugin-mock";

// https://vitejs.dev/config/
export default defineConfig({
  plugins: [
    vue(),
    viteMockServe({
      mockPath: "mock",
      localEnabled: true,
    }),
  ],
});

mock/index.js

import Mock from 'mockjs'
// 内存模拟数据
const arr = []
for (let i = 0; i < 10; i++) {
  arr.push({
    id: Mock.mock('@guid'),
    name: Mock.mock('@cname'),
    place: Mock.mock('@county(true)'),
  })
}
export default [
  {
    url: '/list',
    method: 'get',
    response: () => {
      return arr
    }
  },
  {
    url: '/del',
    method: 'delete',
    response: ({query}) => {
      const index = arr.findIndex((item) => item.id === query.id)
      arr.splice(index, 1)
      return { success: true }
    }
  }
]

如果对你有帮助,点赞、收藏、关注是我更新的动力!👋🌟🚀

🎉 往期精彩回顾

  1. VS Code上搭建Vue开发环境
  • 文章浏览阅读10.1k次,点赞64次,收藏13次。
  1. Color-UI 简介及使用教程
  • 文章浏览阅读5.9k次,点赞13次,收藏2次。
  1. Vue.2&Vue.3项目引入Element-UI教程&踩坑
  • 文章浏览阅读9.2k次,点赞82次,收藏22次。
  1. VS code搭建C/C++运行环境简单易上手
  • 文章浏览阅读2.7k次,点赞8次,收藏5次。
  1. 入门指南:使用uni-app构建跨平台应用
  • 文章浏览阅读1.2k次,点赞29次,收藏9次。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

SingleSpa微前端基本使用以及原理

先说说singleSpa的缺点 不够灵活 不能动态加载css文件css不隔离没有js沙箱的机制 ( 没有全局对象 每次切换的应用 都是同一个window ) 但是刚刚接触微前端 可以了解一下微前端的基础使用 qiankun微前端框架已经很成熟 也是基于singleSpa来实现的 点击跳转qiankun的基础使用 大…

【Vuforia+Unity】一个简单AR识别图像弹出按钮播放暂停视频

场景搭建 2.按钮播放视频这部分写一个按钮回调函数即可 3.控制视频的代码 using System.Collections; using System.Collections.Generic; using UnityEngine; using UnityEngine.Video;public class videomanager : MonoBehaviour {// 这个脚本实现按钮控制VIDEO播放GameO…

snakeflow的springboot项目

Gitee搜索“liuxz/snakerflow”&#xff0c;它是spring boot集成了一款国产工作流引擎snakerflow。 下面是安装步骤&#xff1a; 创建数据库snaker-web&#xff0c;字符集设置成utf8mb4和utf8mb4_generic。不然的话&#xff0c;中文插入不进去。 运行sql命令 CREATE TABLE …

算法刷题day29:区间合并

目录 引言概念一、挤牛奶二、区间合并三、校门外的树四、管道 引言 区间合并这种题&#xff0c;是比较小的题&#xff0c;一般是不会直接出成一道题来考你的&#xff0c;一般思路都是给一道题&#xff0c;里面包含了各种的点&#xff0c;每一个点都需要一个想区间合并这样的知…

【代表作神刊】经管社科类,稀缺SSCI2区期刊,仅14天见刊,2天检索!!

2024年3月第二周&#xff0c;我处EA-ISET协会推荐发表的文章目前都在有序进行中&#xff0c; 新增检索5篇&#xff0c;SSCI5篇&#xff1b; 新增见刊10篇&#xff0c;SSCI1篇&#xff0c;CNKI5篇&#xff0c;谷歌普刊4篇&#xff1b; 现整理部分录用案例&#xff0c;时间节点…

新书速览|机器学习实战:视频教学版

掌握线性回归、分类、数据降维、聚类、关联规则、协同过滤算法及应用 本书内容 《机器学习实战&#xff1a;视频教学版》基于Python语言详细讲解机器学习算法及其应用&#xff0c;用于读者快速入门机器学习。本书配套示例源代码、PPT课件、教学视频、教学大纲、习题与答案、作者…

Voip测试工具

SIPp是一个测试SIP协议性能的工具软件。这是一个GPL的开放源码软件。 sipp是安装在linux机器上的 SIPp可以用来测试许多真实的SIP设备&#xff0c;如SIP代理&#xff0c;B2BUAs,SIP媒体服务器&#xff0c;SIP/x网关&#xff0c;SIP PBX&#xff0c;等等&#xff0c;它也可以模…

for、while、do...while循环的使用

本篇文章只记录for、while、do...while循环的使用&#xff0c;由于java循环较为简单&#xff0c;所以直接上代码。 1、for循环 需求&#xff1a;循环遍历求和 1-100。 public class Demo {public static void main(String[] args) {int sum 0;for (int i 1; i < 100; i…

技术驱动校园招聘:Java+SpringBoot+Vue的实践之旅

✍✍计算机编程指导师 ⭐⭐个人介绍&#xff1a;自己非常喜欢研究技术问题&#xff01;专业做Java、Python、微信小程序、安卓、大数据、爬虫、Golang、大屏等实战项目。 ⛽⛽实战项目&#xff1a;有源码或者技术上的问题欢迎在评论区一起讨论交流&#xff01; ⚡⚡ Java实战 |…

Linux——线程(2)

在上一篇博客中我介绍了Linux中的线程是什么样的&#xff0c;就如同进程可以通过 fork创建&#xff0c;可以被终止&#xff0c;可以退出一样&#xff0c;线程也可以被我们用户控制&#xff0c;这 篇博客我会介绍线程的控制&#xff0c;并且基于线程的控制所产生的一些问题进行 …

麒麟信安集控云工作站解决方案,驱动电网奔向数字化转型新未来!

集控站是电网运行信息的集中监控中心&#xff0c;实现对电网设备状态感知、缺陷发现、主动预警、风险管控和应急处置的全流程闭环管控&#xff0c;在保障日常供电方面发挥重要作用。此前集控站主要采用网络KVM矩阵&#xff0c;其数字化转型面临延长距离受限、无法实现跨辖区延伸…

Redis及其常用命令(二)

SortedSet类型 在此类型中&#xff0c;每个元素都有一个分数 key -> string value -> sorted([socre,member],[score,member]...) # 添加元素 zadd key score member # 遍历集合 zrange key start stop [withscores] #升序 zrevrange key start stop [withscores]#降序…

二、vue-cli项目搭建

系列文章&#xff1a; vue实战&#xff08;商城后台管理系统&#xff09;&#xff1a;http://t.csdnimg.cn/f6Fqa vue.js :http://t.csdnimg.cn/mljxv 目录 系列文章&#xff1a; vue实战&#xff08;商城后台管理系统&#xff09;&#xff1a;http://t.csdnimg.cn/f6Fqa vue…

O2OA(翱途)流程引擎中如何修改,定制流程的流转记录

使用场景 在特殊使用场景中需要定制流转记录,比如业务上需要修改用户名称,修改时间和意见等. 比如一下场景: 需要将用户"b(company01)"的流转记录修改为"d(company01)". 手工修改 系统默认提供维护工具,在有权限的情况下可以直接进行维护. 通过"左…

AI壁纸号一周增加上千粉丝,轻松变现的成功案例分享

前言 随着AI绘画技术的发展&#xff0c;传统的互联网副业壁纸号在新的技术加持下迎来了第二春。本文将分享一位壁纸号创作者的成功案例&#xff0c;并为大家提供创作门槛和硬件要求等相关信息。 该项目的创作门槛极低&#xff0c;基本上可以由AI完成内容创作。不过&#xff0…

“我快无聊死了”用英语怎么说?柯桥英语口语学习,成人零基础学外语

每日一句 Im bored to death. 我快无聊死了。 单词解析&#xff1a; bored / bɔːd / adj.无聊的&#xff0c;厌倦的 bored to d15857575376eath&#xff1a;指非常无聊或厌烦&#xff0c;达到了极点的程度。 "bored" 和 "boring" 都与无聊相关&#…

Python编程从入门到实践中的一些误区

1.num 使用num时python报错&#xff0c;后来查过后才知道是因为python不支持自增或自减&#xff0c;可以用1。 2.字符串和非字符串连接 要先将非字符串转换为字符串类型之后才能连接 print&#xff08;2int&#xff08;‘2’&#xff09;&#xff09;#4 3.关键字参数必须在未…

基于springboot+vue的电子商务系统(源码+论文)

目录 前言 一、功能设计 二、功能实现 三、库表设计 四、论文 前言 各种购物网站现在已经成了生活中不可缺少的调味品,比如比较全面的淘宝网,还有可以进行交流问答的小红书APP,还有电脑爱好者者们的天堂京东商城等等。拥有一个功能丰富、操作方便的电子商务销售网站,可以汇…

jenkins部署go应用 基于docker-compose

丢弃旧的的构建 github 拉取代码 指定go的编译版本 编写docker-compose 文件 docker-compose.yaml version: "3"services:game-api:image: centos:7working_dir: /appcontainer_name: game-api #自定义command: "./game-api -f conf/config.yaml"por…

针对二进制储存方式深度解析

int main() { int a[4] { 1, 2, 3, 4 }; int* p1 (int*)(&a 1); int* p2 (int*)((int)a 1); printf("%x %x", p1[-1], *p2); return 0; } X86环境下运行 %x打印16进制。 整形指针1跳过四个字节&#xff0c;((int)a 1)强制类型转换为…