1. 程式人生 > 程式設計 >在Vue中使用mockjs程式碼例項

在Vue中使用mockjs程式碼例項

前言

  前後端分離的開發模式,前端需要向後端請求資料(ajax請求),但實際開發過程中,前後端會約定一份介面文件,但前後端開發進度並不一致,當後端沒有完善介面功能時,前端需要在本地模擬資料返回,此時需要使用到mockjs。

安裝

npm install mockjs --save-dev

目錄結構

在Vue中使用mockjs程式碼例項

配置

1、api下的config.js:配置axios的攔截處理

import axios from 'axios'

// 建立一個axios例項
const service = axios.create({
  //請求超時配置
  timeout:3000
})
//新增請求攔截器
service.interceptors.request.use(
  config => {
    return config
  },err => {
    console.log(err)
  }
)
//新增響應攔截器
service.interceptors.response.use(
  response => {
    let res = {}
    res.status = response.status
    res.data = response.data
    return res
  },err => {
    console.log(err)
  }
)

export default service

另外一個應用場景,劫持請求,獲取token,為請求新增token:

// 請求攔截器
axios.interceptors.request.use(config => {
  const token = localStorage.getItem('userToken');
  if (token) { // 判斷是否存在token,如果存在的話,則每個http header都加上token
   config.headers.accessToken = token;
  }
  return config;
 },error => {
  return Promise.reject(error);
 })

2、mock目錄下index.js

import Mock from 'mockjs'
import homeApi from './home'
import userApi from './user'


// 設定200-2000毫秒延時請求資料
// Mock.setup({
//  timeout: '200-2000'
// })

// 首頁相關
// 攔截的是 /home/getData
Mock.mock(/\/home\/getData/,'get',homeApi.getStatisticalData)

// 使用者相關
Mock.mock(/\/user\/getUser/,userApi.getUserList)
Mock.mock(/\/user\/del/,userApi.deleteUser)
Mock.mock(/\/user\/batchremove/,userApi.batchremove)
Mock.mock(/\/user\/add/,'post',userApi.createUser)
Mock.mock(/\/user\/edit/,userApi.updateUser)
Mock.mock(/\/home\/getData/,homeApi.getStatisticalData)
import Mock from 'mockjs'

// 圖表資料
let List = []
export default {
 getStatisticalData: () => {
  for (let i = 0; i < 7; i++) {
   List.push(
    Mock.mock({
     vue: Mock.Random.float(100,8000,2),wechat: Mock.Random.float(100,ES6: Mock.Random.float(100,Redis: Mock.Random.float(100,React: Mock.Random.float(100,springboot: Mock.Random.float(100,2)
    })
   )
  }
  return {
   code: 20000,data: {
    // 餅圖
    videoData: [
     {
      name: 'springboot',value: Mock.Random.float(1000,10000,2)
     },{
      name: 'vue',{
      name: '小程式',{
      name: 'ES6',{
      name: 'Redis',{
      name: 'React',2)
     }
    ],// 柱狀圖
    userData: [
     {
      date: '週一',new: Mock.Random.integer(1,100),active: Mock.Random.integer(100,1000)
     },{
      date: '週二',{
      date: '週三',{
      date: '週四',{
      date: '週五',{
      date: '週六',{
      date: '週日',1000)
     }
    ],// 折線圖
    orderData: {
     date: ['20191001','20191002','20191003','20191004','20191005','20191006','20191007'],data: List
    },tableData: [
     {
      name: 'ES6',todayBuy: Mock.Random.float(100,1000,monthBuy: Mock.Random.float(3000,5000,totalBuy: Mock.Random.float(40000,1000000,{
      name: 'Vue',{
      name: 'springboot',2)
     }
    ]
   }
  }
 }
}

home.js
import Mock from 'mockjs'

// get請求從config.url獲取引數,post從config.body中獲取引數
function param2Obj(url) {
 const search = url.split('?')[1]
 if (!search) {
  return {}
 }
 return JSON.parse(
  '{"' +
   decodeURIComponent(search)
    .replace(/"/g,'\\"')
    .replace(/&/g,'","')
    .replace(/=/g,'":"') +
   '"}'
 )
}
let List = []
const count = 200
for (let i = 0; i < count; i++) {
 List.push(
  Mock.mock({
   id: Mock.Random.guid(),name: Mock.Random.cname(),addr: Mock.mock('@county(true)'),'age|18-60': 1,birth: Mock.Random.date(),sex: Mock.Random.integer(0,1)
  })
 )
}

export default {
 /**
  * 獲取列表
  * 要帶引數 name,page,limt; name可以不填,limit有預設值。
  * @param name,limit
  * @return {{code: number,count: number,data: *[]}}
  */
 getUserList: config => {
  const { name,page = 1,limit = 20 } = param2Obj(config.url)
  console.log('name:' + name,'page:' + page,'分頁大小limit:' + limit)
  const mockList = List.filter(user => {
   if (name && user.name.indexOf(name) === -1 && user.addr.indexOf(name) === -1) return false
   return true
  })
  const pageList = mockList.filter((item,index) => index < limit * page && index >= limit * (page - 1))
  return {
   code: 20000,count: mockList.length,list: pageList
  }
 },/**
  * 增加使用者
  * @param name,addr,age,birth,sex
  * @return {{code: number,data: {message: string}}}
  */
 createUser: config => {
  const { name,sex } = JSON.parse(config.body)
  console.log(JSON.parse(config.body))
  List.unshift({
   id: Mock.Random.guid(),name: name,addr: addr,age: age,birth: birth,sex: sex
  })
  return {
   code: 20000,data: {
    message: '新增成功'
   }
  }
 },/**
  * 刪除使用者
  * @param id
  * @return {*}
  */
 deleteUser: config => {
  const { id } = param2Obj(config.url)
  if (!id) {
   return {
    code: -999,message: '引數不正確'
   }
  } else {
   List = List.filter(u => u.id !== id)
   return {
    code: 20000,message: '刪除成功'
   }
  }
 },/**
  * 批量刪除
  * @param config
  * @return {{code: number,data: {message: string}}}
  */
 batchremove: config => {
  let { ids } = param2Obj(config.url)
  ids = ids.split(',')
  List = List.filter(u => !ids.includes(u.id))
  return {
   code: 20000,data: {
    message: '批量刪除成功'
   }
  }
 },/**
  * 修改使用者
  * @param id,name,data: {message: string}}}
  */
 updateUser: config => {
  const { id,sex } = JSON.parse(config.body)
  const sex_num = parseInt(sex)
  List.some(u => {
   if (u.id === id) {
    u.name = name
    u.addr = addr
    u.age = age
    u.birth = birth
    u.sex = sex_num
    return true
   }
  })
  return {
   code: 20000,data: {
    message: '編輯成功'
   }
  }
 }
}

user.js

mockjs

Mock.mock( rurl,rtype,function( options ) )
Mock.mock( rurl,template )
表示當攔截到rurl和rtype的ajax請求時,將根據資料模板template生成模擬資料,並作為響應資料返回。

Mock.mock( rurl,function( options ) )
記錄用於生成響應資料的函式。當攔截到匹配 rurl 和 rtype 的 Ajax 請求時,函式 function(options) 將被執行,並把執行結果作為響應資料返回。
其中:
rurl 可選
表示要攔截的url,可以使字串,也可以是正則
rtype 可選
表示要攔截的ajax請求方式,如get、post
template 可選
資料模板,可以是物件也可以是字串
function(option) 可選
表示用於生成響應資料的函式

3.main.js

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import store from './store'
//全域性配置
import http from '@/api/config'
import './mock'

//第三方包

Vue.prototype.$http = http
Vue.config.productionTip = false

new Vue({
 router,store,render: h => h(App)
}).$mount('#app')

4、元件中的方法如何使用:

this.$http.get('/home/getData').then(res => {
    //
   })

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。