目錄
一、Mock.js
1.1?mockjs介紹
1.2 mock.js安裝與配置
1.2.1 安裝mock.js
1.2.2 引入mock.js
1.3 mock.js的使用
1.3.1?準(zhǔn)備模擬數(shù)據(jù)
1.3.2?定義攔截路由
1.3.3 測(cè)試
二、首頁(yè)導(dǎo)航欄左側(cè)菜單搭建
2.1 自定義界面組件 (完整代碼)
2.2 配置路由
2.3?組件顯示折疊和展示圖標(biāo)
2.4 總線(xiàn)完成組件通信
2.5 效果展示
一、Mock.js
1.1?mockjs介紹
????????Mock.js是一個(gè)用于生成隨機(jī)數(shù)據(jù)和模擬接口請(qǐng)求的JavaScript庫(kù)。它可以幫助開(kāi)發(fā)人員在前端開(kāi)發(fā)過(guò)程中模擬后端接口的返回?cái)?shù)據(jù),以便進(jìn)行前端頁(yè)面的開(kāi)發(fā)和測(cè)試。
Mock.js有兩個(gè)重要的特性風(fēng)靡前端:
- 數(shù)據(jù)類(lèi)型豐富
????????Mock.js提供了一套簡(jiǎn)單易用的API,可以用于生成各種類(lèi)型的隨機(jī)數(shù)據(jù),如字符串、數(shù)字、布爾值、日期等。開(kāi)發(fā)人員可以使用Mock.js定義接口的返回?cái)?shù)據(jù)結(jié)構(gòu),并生成符合該結(jié)構(gòu)的隨機(jī)數(shù)據(jù)。
- 攔截Ajax請(qǐng)求
????????通過(guò)攔截Ajax請(qǐng)求,Mock.js可以截獲前端發(fā)送的請(qǐng)求,并根據(jù)預(yù)先定義的規(guī)則返回模擬的數(shù)據(jù)。延時(shí)響應(yīng)功能可以模擬網(wǎng)絡(luò)延遲,以便測(cè)試頁(yè)面在不同網(wǎng)絡(luò)條件下的表現(xiàn)。動(dòng)態(tài)數(shù)據(jù)生成功能可以根據(jù)請(qǐng)求參數(shù)生成符合條件的隨機(jī)數(shù)據(jù)。不需要修改既有代碼,就可以攔截Ajax請(qǐng)求,返回模擬的響應(yīng)數(shù)據(jù)。
1.2 mock.js安裝與配置
1.2.1 安裝mock.js
npm i mockjs -D
tips:在前面也講到了-S,-G兩種命令行的選項(xiàng),這里綜合講解一下這三種的區(qū)別
- -S選項(xiàng)用于啟動(dòng)開(kāi)發(fā)服務(wù)器
- -D選項(xiàng)用于在啟動(dòng)開(kāi)發(fā)服務(wù)器后自動(dòng)打開(kāi)瀏覽器
- -G選項(xiàng)用于生成代碼或文件。它們分別用于不同的開(kāi)發(fā)場(chǎng)景和需求,具體使用取決于你的目標(biāo)和任務(wù)。
1.2.2 引入mock.js
為了只在開(kāi)發(fā)環(huán)境使用mock,而打包到生產(chǎn)環(huán)境時(shí)自動(dòng)不使用mock,我們可以在config目錄中的dev.env.js
和?prod.env.js
做一個(gè)配置,如下:
-
dev.env.js :生產(chǎn)環(huán)境
/* 開(kāi)發(fā)環(huán)境 */
'use strict'
const merge = require('webpack-merge')
const prodEnv = require('./prod.env')
module.exports = merge(prodEnv, {
NODE_ENV: '"development"',
MOCK: 'ture'
})
-
prod.env.js:開(kāi)發(fā)環(huán)境
/* 生產(chǎn)環(huán)境 */
'use strict'
module.exports = {
NODE_ENV: '"production"',
MOCK: 'false'
}
-
main.js
//開(kāi)發(fā)環(huán)境下才會(huì)引入mockjs
process.env.MOCK && require('@/mock')
1.3 mock.js的使用
1.3.1?準(zhǔn)備模擬數(shù)據(jù)
為每個(gè)*.vue定義單獨(dú)的xxx-mock.js文件,并在其中添加自定義的json數(shù)據(jù),還可以通過(guò)mockjs的模塊生成隨機(jī)數(shù)據(jù)信息,動(dòng)態(tài)測(cè)試ajax請(qǐng)求效果。
創(chuàng)建src/mock/json
目錄,定義登錄測(cè)試數(shù)據(jù)文件login-mock.js:
//在沒(méi)有使用mock.js前,定義數(shù)據(jù)的方式(死數(shù)據(jù))
/* const loginInfo = {
code: -1,
message: '密碼錯(cuò)誤'
} */
//使用mockjs的模板生成隨機(jī)數(shù)據(jù)
const loginInfo = {
//1表示50%概率
"success|1": true,
//2-3指重復(fù)2到3次
"msg|2-3": 'msg'
}
//將當(dāng)前模塊導(dǎo)出,導(dǎo)出后index.js才可以導(dǎo)入
export default loginInfo;
面試題:js中const,var,let區(qū)別?分別寫(xiě)一個(gè)例子?
1.變量提升:var存在變量提升,而let與const不存在變量提升,即在變量只能在聲明之后使用,否在會(huì)報(bào)錯(cuò)。
2.重復(fù)聲明:var定義的變量可以聲明多次,const和let不允許重復(fù)聲明變量
3.給全局添加屬性:瀏覽器的全局對(duì)象是window,Node的全局對(duì)象是global。var聲明的變量為全局變量,并且會(huì)將該變量添加為全局對(duì)象的屬性,但是let和const不會(huì)。
4.暫時(shí)性死區(qū): 在使用let、const命令聲明變量之前,該變量都是不可用的。這在語(yǔ)法上,稱(chēng)為暫時(shí)性死區(qū)。使用var聲明的變量不存在暫時(shí)性死區(qū)。
5.初始值設(shè)置: 在變量聲明時(shí),var 和 let 可以不用設(shè)置初始值。而const聲明變量必須設(shè)置初始值。
6.塊級(jí)作用域: 塊作用域由 { }包括,let和const具有塊級(jí)作用域,var不存在塊級(jí)作用域。塊級(jí)作用域解決了ES5中的兩個(gè)問(wèn)題:
- 內(nèi)層變量可能覆蓋外層變量
- 用來(lái)計(jì)數(shù)的循環(huán)變量泄露為全局變量
1.3.2?定義攔截路由
????????在src目錄下創(chuàng)建mock目錄,定義mock主文件index.js,并在該文件中定義攔截路由配置,/src/mock/index.js。
import Mock from 'mockjs' //引入mockjs,npm已安裝
import action from '@/api/action' //引入請(qǐng)求地址
//全局設(shè)置:設(shè)置所有ajax請(qǐng)求的超時(shí)時(shí)間,模擬網(wǎng)絡(luò)傳輸耗時(shí)
Mock.setup({
// timeout: 400 //延時(shí)400s請(qǐng)求到數(shù)據(jù)
timeout: 200 - 400 //延時(shí)200-400s請(qǐng)求到數(shù)據(jù)
})
//獲取請(qǐng)求的url
let url = action.getFullPath('SYSTEM_USER_DOLOGIN');
//引登陸的測(cè)試數(shù)據(jù),并添加至mockjs
import loginInfo from '@/mock/json/login-mock.js'
Mock.mock(url, "post", loginInfo)
//如果請(qǐng)求既可以是get又可以是post的請(qǐng)求方式可以使用如下方式:
// Mock.mock(s1, /post|get/i, loginInfo)
1.3.3 測(cè)試
編輯Login.vue文件,根據(jù)不同響應(yīng),給出不同提示。
<template>
<div class="login-wrap">
<el-form class="login-container">
<h1 class="title">用戶(hù)登錄</h1>
<el-form-item label="">
<el-input type="text" v-model="username" placeholder="登錄賬號(hào)" autocomplete="off"></el-input>
</el-form-item>
<el-form-item label="">
<el-input type="password" v-model="password" placeholder="登錄密碼" autocomplete="off"></el-input>
</el-form-item>
<el-form-item>
<el-button type="warning" style="width:100%;" @click="doSubmit()">提交</el-button>
</el-form-item>
<el-row style="text-align: center;margin-top:-10px">
<el-link type="primary">忘記密碼</el-link>
<el-link type="primary" @click="gotoRegister()">用戶(hù)注冊(cè)</el-link>
</el-row>
</el-form>
</div>
</template>
<script>
export default {
name: 'Login',
data() {
return {
username: '',
password: ''
}
},
methods: {
gotoRegister() {
this.$router.push("/Register");
},
doSubmit() {
//定義后臺(tái)登錄方法連接地址
let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
//獲取數(shù)據(jù)
let params = {
username: this.username,
password: this.password
};
/* get請(qǐng)求進(jìn)行參數(shù)傳遞 */
this.axios.get(url, {
params: params
}).then(r => {
console.log(r);
//提示成功和失敗,主要演示獲取響應(yīng)數(shù)據(jù)的方法
if (r.data.success) {
//可以到element-ui官網(wǎng)查看用法
this.$message({
message: '登錄成功',
type: 'success'
});
}else{
this.$message({
message: '登錄失敗',
type: 'error'
});
}
}).catch(e => {
//異常信息
});
}
}
}
</script>
<style scoped>
.login-wrap {
box-sizing: border-box;
width: 100%;
height: 100%;
padding-top: 10%;
background-image: url('/static/imgs/books2.jpg');
/* background-color: #3b7cf5; */
background-repeat: no-repeat;
background-position: center right;
background-size: 100%;
}
.login-container {
border-radius: 10px;
margin: 0px auto;
width: 350px;
padding: 30px 35px 15px 35px;
border: 1px solid #eaeaea;
text-align: left;
background-color: rgba(229, 229, 229, 0.8);
}
.title {
margin: 0px auto 40px auto;
text-align: center;
color: #0b0b0b;
}
</style>
這樣就不需要跟后臺(tái)進(jìn)行交互,通過(guò)mock.js模擬數(shù)據(jù)進(jìn)行功能測(cè)試。
二、首頁(yè)導(dǎo)航欄左側(cè)菜單搭建
2.1 自定義界面組件 (完整代碼)
1. AppMain.vue 界面總?cè)萜?/strong>
<template>
<el-container class="main-container">
<el-aside v-bind:class="asideClass">
<LeftNav></LeftNav>
</el-aside>
<el-container>
<el-header class="main-header">
<TopNav></TopNav>
</el-header>
<el-main class="main-center">首頁(yè)</el-main>
</el-container>
</el-container>
</template>
<script>
// 導(dǎo)入組件
import TopNav from '@/components/TopNav.vue'
import LeftNav from '@/components/LeftNav.vue'
// 導(dǎo)出模塊
export default {
//組件名稱(chēng)
name: 'AppMain',
data: function() {
return {
asideClass: 'main-aside',
}
},
//將import的組件定義的Main中以便于使用
components: {
TopNav,
LeftNav
},
created() {
this.$root.Bus.$on('aaa', r => {
this.asideClass = r ? 'main-aside-collapsed' : 'main-aside';
});
}
};
</script>
<style scoped>
.main-container {
height: 100%;
width: 100%;
box-sizing: border-box;
}
.main-aside-collapsed {
/* 在CSS中,通過(guò)對(duì)某一樣式聲明! important ,可以更改默認(rèn)的CSS樣式優(yōu)先級(jí)規(guī)則,使該條樣式屬性聲明具有最高優(yōu)先級(jí) */
width: 64px !important;
height: 100%;
background-color: #e2b100;
margin: 0px;
}
.main-aside {
width: 240px !important;
height: 100%;
background-color: #e2b100;
margin: 0px;
}
.main-header,
.main-center {
padding: 0px;
border-left: 2px solid #dedede;
}
</style>
2. LegtNav.vue 左側(cè)菜單
<template>
<el-menu default-active="2" class="el-menu-vertical-demo" background-color="#ffbf00" text-color="#fff"
active-text-color="#ffd04b" :collapse="collapsed">
<div class="logobox">
<img class="logoimg" src="../assets/imgs/logo.png" alt="">
</div>
<el-submenu index="1">
<template slot="title">
<i class="el-icon-location"></i>
<span>導(dǎo)航一</span>
</template>
<el-menu-item-group>
<template slot="title">分組一</template>
<el-menu-item index="1-1">選項(xiàng)1</el-menu-item>
<el-menu-item index="1-2">選項(xiàng)2</el-menu-item>
</el-menu-item-group>
<el-menu-item-group title="分組2">
<el-menu-item index="1-3">選項(xiàng)3</el-menu-item>
</el-menu-item-group>
<el-submenu index="1-4">
<template slot="title">選項(xiàng)4</template>
<el-menu-item index="1-4-1">選項(xiàng)1</el-menu-item>
</el-submenu>
</el-submenu>
<el-menu-item index="2">
<i class="el-icon-menu"></i>
<span slot="title">導(dǎo)航二</span>
</el-menu-item>
<el-menu-item index="3" disabled>
<i class="el-icon-document"></i>
<span slot="title">導(dǎo)航三</span>
</el-menu-item>
<el-menu-item index="4">
<i class="el-icon-setting"></i>
<span slot="title">導(dǎo)航四</span>
</el-menu-item>
</el-menu>
</template>
<script>
export default {
name: 'LeftNav',
data: function() {
return {
collapsed: false
}
},
created() {
this.$root.Bus.$on('aaa', r => {
this.collapsed = r;
});
}
}
</script>
<style>
.el-menu-vertical-demo:not(.el-menu--collapse) {
width: 240px;
min-height: 400px;
}
.el-menu-vertical-demo:not(.el-menu--collapse) {
border: none;
text-align: left;
}
.el-menu-item-group__title {
padding: 0px;
}
.el-menu-bg {
background-color: #ffbf00 !important;
}
.el-menu {
border: none;
}
.logobox {
height: 40px;
line-height: 40px;
color: #9d9d9d;
font-size: 20px;
text-align: center;
padding: 20px 0px;
}
.logoimg {
height: 40px;
}
</style>
3. TopNav.vue 頂部導(dǎo)航欄
<template>
<el-menu class="el-menu-demo" mode="horizontal" background-color="#ffbf00" text-color="#fff" active-text-color="#fff">
<el-button class="buttonimg">
<img class="showimg" :src="collapsed?imgshow:imgsq" @click="doToggle()">
</el-button>
<el-submenu index="2" class="submenu">
<template slot="title">超級(jí)管理員</template>
<el-menu-item index="2-1">設(shè)置</el-menu-item>
<el-menu-item index="2-2">個(gè)人中心</el-menu-item>
<el-menu-item @click="exit()" index="2-3">退出</el-menu-item>
</el-submenu>
</el-menu>
</template>
<script>
export default {
name: 'TopNav',
data: function() {
return {
collapsed: false,
//require是node中遵循CommonJS規(guī)范的模塊化解決方案,支持動(dòng)態(tài)引入
imgshow: require('@/assets/imgs/show.png'),
imgsq: require('@/assets/imgs/sq.png')
}
},
methods: {
doToggle() { //收起左側(cè)菜單事件
this.collapsed = !this.collapsed;
//將是否折疊的變量放入總線(xiàn)
this.$root.Bus.$emit('aaa', this.collapsed);
},
exit() { //退出事件
//跳轉(zhuǎn)登錄界面
this.$router.push("/")
}
}
}
</script>
<style scoped>
.el-menu-vertical-demo:not(.el-menu--collapse) {
border: none;
}
.submenu {
float: right;
}
.buttonimg {
height: 60px;
background-color: transparent;
border: none;
}
.showimg {
width: 26px;
height: 26px;
position: absolute;
top: 17px;
left: 17px;
}
.showimg:active {
border: none;
}
</style>
2.2 配置路由
router/index.js, 配置路由前先導(dǎo)入Main組件
import AppMain from '@/components/AppMain'
import LeftNav from '@/components/LeftNav'
import TopNav from '@/components/TopNav'
?將LeftNav和TopNav子組件配置到AppMain總?cè)萜髦校?/p>
export default new Router({
routes: [
{
path: '/',
name: 'Login',
component: Login
},{
path: '/AppMain',
name: 'AppMain',
component: AppMain,
children:[
{
path: '/LeftNav',
name: 'LeftNav',
component: LeftNav
},{
path: '/TopNav',
name: 'TopNav',
component: TopNav
}
]
}
]
})
?
2.3?組件顯示折疊和展示圖標(biāo)
TopNav.vue:?
LeftNav.vue:?
?
2.4 總線(xiàn)完成組件通信
如果要完成組件整合,需要通過(guò)定義總線(xiàn)將父組件(AppMain)與子組件進(jìn)行通信;
src/mai.js:
new Vue({
el: '#app',
data() {
return {
/* 創(chuàng)建一個(gè)Bus總線(xiàn) */
Bus: new Vue()
}
},
router,
components: {
App
},
template: '<App/>'
})
TopNav.vue:?
把是否折疊的變量放入總線(xiàn)中方便其他組件調(diào)取。?
LeftNav:
?在組件創(chuàng)建時(shí)訂閱了一個(gè)名為?
'aaa'
?的事件,并在事件觸發(fā)時(shí)將接收到的數(shù)據(jù)賦值給?collapsed
?屬性。
?
?
AppMain.vue:
在組件創(chuàng)建時(shí)訂閱了一個(gè)名為?
'aaa'
?的事件,并在事件觸發(fā)時(shí)將接收到的數(shù)據(jù)賦值給?asideClass
屬性(通過(guò)true或false賦予相應(yīng)的樣式)。
?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-716903.html
2.5 效果展示
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-716903.html
到了這里,關(guān)于【Vue】Mock.js介紹和使用與首頁(yè)導(dǎo)航欄左側(cè)菜單搭建的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!