Vue 封装mock使用总结

前言:在vue项目模块化中mock的封装方式有很多种,以下总结一下自己常用的封装方式。

方式一:Promise接口封装(不推荐)

优点:简单易懂
确定:接口调用简单,切换成生产以后需要换url
结论:不是很适合,如果只是简单的展示数据可以使用。

大纲

1.在src文件中新建`api、mock`文件夹
2.在`api、mock`文件中创建index文件和其他文件
3.main文件引入api文件
4.demo页面调用

在这里插入图片描述

1.api目录

src/api/index.js

import * as user from './user'

export default {
  ...user
}

src/api/user.js

import { tableData } from '@/mock/user'

export const getTableData = (page) => {
  return new Promise((resolve, reject) => {
    resolve({ data: tableData })
  })
}

2.mock目录

src/mock/user.js

import Mock from 'mockjs'
export const userInfo = {
  userInfo: {
    username: 'admin',
    name: 'avue',
    avatar: 'https://gitee.com/uploads/61/632261_smallweigit.jpg'
  },
  roles: ['admin'],
  permission: [
    'sys_crud_btn_add',
    'sys_crud_btn_export',
    'sys_menu_btn_add',
    'sys_menu_btn_edit',
    'sys_menu_btn_del',
    'sys_role_btn1',
    'sys_role_btn2',
    'sys_role_btn3',
    'sys_role_btn4',
    'sys_role_btn5',
    'sys_role_btn6'
  ] // 权限级别
}
let List = []
for (let i = 0; i < 5; i++) {
  List.push(Mock.mock({
    id: '@increment',
    name: Mock.mock('@cname'),
    username: Mock.mock('@last'),
    type: [0, 2],
    checkbox: [0, 1],
    'number|0-100': 0,
    'sex|0-1': 0,
    moreselect: [0, 1],
    'grade|1-2': true,
    address: Mock.mock('@cparagraph(1, 3)'),
    check: [1, 3, 4]
  }))
}
export const tableData = {
  total: 11,
  pageSize: 10,
  tableData: List
}

3.main.js引入

src/main.js

import Api from '@/api/index.js'
Vue.prototype.$api = Api

4.页面使用

src/view/DemoPage.vue

methods: {
 getdata () {
    this.$api.getTableData().then(res => {
      console.log(res, '获取数据')
    })
  }
}

接口效果

在这里插入图片描述

方式二:axios的mock数据(虽然比较灵活,但还是不推荐)

1. 安装

npm install axios
npm install mockjs --save-dev

2. main.js文件中引入

import '@/assets/js/mock.js'
import axios from 'axios'
Vue.prototype.$axios = axios

3. 新建mock文件夹,添加index、和其他接口文件

在这里插入图片描述
src/mock/base.js

// 引入mockjs
import Mock from 'mockjs'


// 延时请求
Mock.setup({
  timeout: 1000
})

export default ({mock}) => {
  if (!mock) return
  // 延时请求到数据
  Mock.setup({
    timeout: 1000
  })

  // 正则拦截URL值
  Mock.mock('/mockUrl', 'get', {
    obj: {
      'mtime': '@datetime', // 随机生成日期时间
      'score|1-800': 800, // 随机生成1-800的数字
      'rank|1-100': 100, // 随机生成1-100的数字
      'stars|1-5': 5, // 随机生成1-5的数字
      'nickname': '@cname' // 随机生成中文名字
    }
  })
}

4. 调用接口数据

methods: {
  getData () {
    var url = '/mockUrl' // 注意接口一定要准确
    this.$axios.get(url).then(res => {
      console.log(res, 'res----')
      this.data = res.data.obj
    }).catch(err => {
      console.log(err)
    })
  }
}

5. 调用结果

在这里插入图片描述

6. 常用Mock生成数据

let basicData = Mock.mock({
    'list|1-100': [{
        'id|+1': 1,
        'isBoolean': '@boolean(10, 0, true)',//百分之百的true
        'naturalNumber': '@natural(1, 1000)', //大于等于零的整数
        'integer': '@integer(0)', //随机整数
        'float': '@float(1, 100, 3, 6)', //随机浮点数, 
        'character': '@character("upper")', //一个随机字符
        'string': '@string("lower", 5, 20)', //一串随机字符串
        'range': '@range(1, 10, 2)', //一个整形数组,步长为2
    }]
});

// console.log(basicData);

let Date = Mock.mock({
    'dateList|10': [{
        'date': '@date',
        'date-yyyy-MM-dd': '@date(yyyy-MM-dd)',
        'date-yy-MM-dd': '@date(yy-MM-dd)',
        'date-y-MM-dd': '@date(y-MM-dd)',
        'date-y-M-d': '@date(y-M-d)',
        'line-through': '------------------------------------------------',
        'timessss': '@time', //随机的时间字符串,
        'time-format': '@time()', //指示生成的时间字符串的格式, default: 'HH: mm: ss',
        'time-format-1': '@time("A HH:mm:ss")',
        'time-format-2': '@time("a HH:mm:ss")',
        'time-format-3': '@time("HH:mm:ss")',
        'time-format-4': '@time("H:m:s")',
        'datetime': '@datetime("yyyy-MM-dd A HH:mm:ss")', //返回一个随机的日期和时间字符串
        'dateNow': '@now("second")' //获取当前完整时间
    }]
});
// console.log(Date);

let imageList = Mock.mock({
    'imageList|5': [{
        'id|+1': 1,
        'img': '@image',//生成一个随机的图片地址,
        'img-1': '@image("200x100", "#000", "#fff", "png", "Mock.js")', //生成一个200*100, 背景色#000,前景色#fff, 格式png, 文字mock.js的图片
    }]
})
// console.log(imageList);

let paragraph = Mock.mock({
    'paragraphList|5': [{
        'id|+1': 1,
        'paragraph1': '@cparagraph(2)', //生成一段2句话的中文文本,
        'paragraph2': '@paragraph(3)', //生成一个3句话的英文文本
        'title': '@title', //随机生成一个英文标题
        'ctitle': '@ctitle', //随机生成一个中文标题
    }]
})
// console.log(paragraph);

let name = Mock.mock({
    'nameList|5': [{
        'id|+1': 1,
        'name': '@name', //英文名,
        'cname': '@cname', //中文名
    }]
})
// console.log(name);

let webList = Mock.mock({
    'webList|5': [{
        'id|+1': 0,
        'url': '@url("http", "baidu.com")', //url: http://www.baidu.com
        'protocol': '@protocol', //随机生成一个url协议
        'domain': '@domain', //随机生成一个域名,
        'email': '@email', //随机生成一个邮箱地址,
        'ip': '@ip' //随机生成一个ip地址
    }]
})
// console.log(webList);

let address = Mock.mock({
    'addressList|5': [{
        'id|+1': 1,
        'region': '@region', //生成一个大区
        'province': '@province', //生成一个省份
        'city': '@city', //生成一个市
        'country': '@country', //一个县
        'zip': '@zip', //邮政编码
    }]
})
console.log(address)

方式三:自我总结axios的mock数据(推荐使用

大纲

1.设置目录结构,设置目录中的模块文件
2.设置main文件
3.page调用

1.设置目录结构

这里主要设置两个目录api 和 mock 目录
在这里插入图片描述
src/api/index.js

// api 接口模块化
import axios from 'axios'

const apiIndex = {
  // 公共接口函数
  async getDataApi (url, method = 'GET', params, data) {
    let temp
    await axios({
      method,
      url,
      params,
      data
    }).then(res => {
      if (res && res.status === 200) {
        console.log(res, '获取数据--')
        temp = res.data
      }
    })
    return temp
  }
}

export default apiIndex

src/mock/index.js

import * as user from '@/mock/user.js'

export default {
  ...user
}

src/mock/user.js

// 引入mockjs
import Mock from 'mockjs'

// 延时请求
Mock.setup({
  timeout: 1000
})

// 获取table数据
Mock.mock('/mockUrl', 'get', {
  obj: {
    'mtime': '@datetime', // 随机生成日期时间
    'score|1-800': 800, // 随机生成1-800的数字
    'rank|1-100': 100, // 随机生成1-100的数字
    'stars|1-5': 5, // 随机生成1-5的数字
    'nickname': '@cname' // 随机生成中文名字
  }
})

2.设置main文件

src/main.js

import Api from '@/api/index.js'

Vue.prototype.$Api = Api

3.page调用

src/view/DemoPage.vue

getdata () {
 this.$Api.getDataApi('/mockUrl').then(res => {
    console.log(res, '接口数据')
  })
}

接口效果

在这里插入图片描述

posted @ 2022-12-06 22:19  轻风细雨_林木木  阅读(95)  评论(0编辑  收藏  举报