作項目過程當中,須要用到後臺模擬數據,在機緣巧合下發現了mock,在學習使用的過程當中又偶遇了axios-mock-adapter。如今將實例展現以下:css
實例是創建在vue-cli的基礎上實現
須要提早安裝的插件有:
axios:npm install axio --save
mockjs:npm install mockjd --save-dev
axios-mock-adapter:npm install axios-mock-adapter --save-devvue
第一種引入方式:按照es6的語法,以import的方式引入
import axios from 'axios';
import MockAdapter from 'axios-mock-adapter';
第二種引入方式:以require方式引入
var axios = require('axios');
var MockAdapter = require('axios-mock-adapter');ios
整個項目的代碼結構以下:es6
首先新建一個login.vue文件,代碼以下ajax
<template> <el-form class="login-container" ref="AccountForm" :model="account" :rules="loginRules" label-position="left"> <h3>Login</h3> <el-form-item prop="username"> <el-input v-model="account.username" type="text" placeholder="帳號"> </el-input> </el-form-item> <el-form-item prop="password"> <el-input v-model="account.password" type="password" placeholder="密碼"></el-input> </el-form-item> <el-checkbox v-model="checked" checked>記住密碼</el-checkbox> <el-form-item> <el-button type="primary">login</el-button> <el-button type="primary">reset</el-button> </el-form-item> </el-form> </template> <script> import {requseLogin} from "../axios/api"; export default { name: "login", data () { return { account: { username: '', password: '' }, loginRules: { username: [{required: true, message: '請輸入帳號', trigger: 'blur'}], password: [{required: true,message: '請輸入密碼', trigger: 'blur'}], }, checked: true, logining: false }; }, methods: {} </script> <style scoped> body{ background: #DFE9FB; } .login-container { width:350px; margin-left:35%; border: 1px solid #d3d3d3; box-sizing: border-box; padding: 10px 30px; border-radius: 5px; } .el-button { width:100%; box-sizing: border-box; margin: 10px 0; } </style>
因爲路由的默認指向是HelloWorld,因此修改router文件夾下的index.jsvue-router
import Vue from 'vue' import Router from 'vue-router' // 懶加載方式,當路由被訪問的時候才加載對應組件 const Login = resolve => require(['@/components/Login'], resolve) Vue.use(Router) export default new Router({ routes: [{ path: '/', name: 'login', component: Login }]
此時登陸界面樣式基本寫好,接下來修改main.js,將須要引入的文件引入
以下:vuex
import Vue from 'vue' import App from './App' import router from './router' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import axios from 'axios' Vue.prototype.$ajax = axios // axios不能直接使用use引入,只能每一個須要發送請求的組件中即時引入,兩種引入方式 // 第一種引入方式:引入axios後,修改原型鏈 // import axios from 'axios' // Vue.prototype.$axios = axios Vue.config.productionTip = false; Vue.use(ElementUI); /* eslint-disable no-new */ new Vue({ el: '#app', router, store, // 使用store components: { App }, template: '<App/>' })
刷新頁面vue-cli
接下來就是對login.vue頁面進行改造:增長登陸點擊事件和重置事件npm
<el-form-item> <el-button @click.native.prevent="handleLogin" :loading="logining" type="primary">login</el-button> <el-button type="primary" class="resetBtn" @click.native.prevent="reset"> reset </el-button> </el-form-item>
此時的點擊事件沒有交互功能,使用axios和mock.js實現交互,而且使用axios-mock-adapter進行axios數據調試
在src下新建一個axios文件夾,並建一個api.jselement-ui
import axios from 'axios' axios.defaults.baseURL = 'http://127.0.0.1:80'; export const requseLogin = params => { return axios.post('/user/login', params); }
再新建一個index.js
import * as api from './api' export default api
這是像後臺發起post請求,地址是‘user/login’
此處的後臺數據咱們使用mockjs進行攔截,而後模擬後臺服務返回的數據
建立mock後臺模擬數據
在src目錄下建立mock文件夾,而且新建一個index.js,index.js內容以下:、
// 經過axios-mock-adapter生成代理api地址 import axios from 'axios' import MockAdapter from 'axios-mock-adapter' // import { LoginUsers } from './data/user' import {users} from './data/user' export default { init() { let mock = new MockAdapter(axios); // mock success request 模擬成功請求 mock.onGet('/success').reply(200, { msg: 'success' }); // mock error request 模擬失敗請求 mock.onGet('/error').reply(500, { msg: 'failure' }) // login 模擬登陸接口 mock.onPost('/user/login').reply(config => { // 解析axios傳過來的數據 let { username, password } = JSON.parse(config.data); return new Promise((resolve, reject) => { // 先建立一個用戶爲空對象 let user = null; setTimeout(() => { // 判斷模擬的假數據中是否有和傳過來的數據匹配的 let hasUser = users.some(person => { // 若是存在這樣的數據 if (person.username === username && person.password === password) { user = JSON.parse(JSON.stringify(person)); user.password = undefined; return true; }else { // 若是沒有這個person return false } }); // 若是有那麼一我的 if (hasUser) { resolve([ 200, {code: 200, msg: '登陸成功',user} ]); } else { // 若是沒有這麼一我的 resolve([ 200, {code: 500, msg: '帳號錯誤' }]) } }, 500); }) }); // 模擬註冊接口 } }
接着在mock下創建data文件夾,;裏面新建user.js用來存放用戶信息
/* * 用來存放一些模擬用戶的數據 * */ // import Mock from 'mockjs' const users = [ { id: 1, username: 'admin', password: '123456', email: '123456@qq.com', name: '搬磚者' }, { id: 2, username: 'lytton', password: '123456', email: 'yyyyy@163.com', name: '混子' } ] export { users }
爲login.vue文件增長登陸方法
<script> import {requseLogin} from "../axios/api"; export default { name: "login", data () { return { account: { username: '', password: '' }, loginRules: { username: [{required: true, message: '請輸入帳號', trigger: 'blur'}], password: [{required: true,message: '請輸入密碼', trigger: 'blur'}], }, checked: true, logining: false }; }, methods: { handleLogin() { this.$refs.AccountForm.validate((valid) => { if (valid) { this.logining = true; let loginParams = { username: this.account.username, password: this.account.password } // 調用axios登陸接口 requseLogin(loginParams).then(res => { // debugger; this.logining = false; // 根據返回的code判斷是否成功 let { code, msg, user } = res.data; if (code === 200) { // elementui中提示組件 this.$message({ type: 'success', message: msg }); // 登錄成功,用戶信息就保存在sessionStorage中 sessionStorage.setItem('user', JSON.stringify(user)); // 跳轉到後臺主頁面 console.log('this',this) this.$router.push({ path: '/home' }) }else { this.$message({ type: 'error', message: msg, }); } }).catch(err =>{ console.log(err); }); }else { console.log('error submit!'); return false; } }) }, reset () { this.$refs.AccountForm.resetFields() }, } } </script>
當點擊登陸按鈕後,跳轉到‘/home’頁面,在components文件夾下面新增home.vue文件
<template> <div > <h1>{{ msg }}</h1> </div> </template> <script> export default { name: '後臺主界面', data () { return { msg: '後臺主界面' } } } </script>
接下了修改router中的index.js
import Vue from 'vue' import Router from 'vue-router' // import HelloWorld from '@/components/HelloWorld' // import Home from '../components/home'; // 懶加載方式,當路由被訪問的時候才加載對應組件 const Login = resolve => require(['@/components/Login'], resolve) const Home = resolve => require(['@/components/home'], resolve) Vue.use(Router) const router = new Router({ routes: [ { path: '/', name: 'login', component: Login }, { path: '/login', name: 'login', component: Login }, { path: '/home', name: 'home', component: Home } ] }) // 訪問以前,檢查是否登錄了 router.beforeEach((to, from, next) => { if(to.path.startsWith('/login')) { window.sessionStorage.removeItem('user'); next() }else { let token = window.sessionStorage.getItem('user'); if (!token) { next({path: '/login'}) }else { next() } } }); export default router
在main.js中引入mock
import Vue from 'vue' import App from './App' import router from './router' //建立Vuex的store,使用分離store的方法,引入vuex import store from './store' import ElementUI from 'element-ui' import 'element-ui/lib/theme-chalk/index.css' import Mock from './mock/index' Mock.init() import axios from 'axios' Vue.prototype.$ajax = axios // axios不能直接使用use引入,只能每一個須要發送請求的組件中即時引入,兩種引入方式 // 第一種引入方式:引入axios後,修改原型鏈 // import axios from 'axios' // Vue.prototype.$axios = axios Vue.config.productionTip = false; Vue.use(ElementUI); /* eslint-disable no-new */ new Vue({ el: '#app', router, store, // 使用store components: { App }, template: '<App/>' })
至此,運行npm run dev便可
文章結合瞭如下博客的內容而成:
連接描述