天天看點

Mock運用以及SPA跳轉和vue Bus總線介紹測試跳轉vue Bus總線

文章目錄

  • 介紹
  • 測試
  • 跳轉
  • vue Bus總線

介紹

Mock.js的特點:

1,前後端分離

讓前端攻城師獨立于後端進行開發。增加單元測試的真實性,通過随機資料,模拟各種場景。

2,開發無侵入

不需要修改既有代碼,就可以攔截 Ajax 請求,傳回模拟的響應資料。

3,資料類型豐富

支援生成随機的文本、數字、布爾值、日期、郵箱、連結、圖檔、顔色等。

4,友善擴充

支援支援擴充更多資料類型,支援自定義函數和正則。

簡單的來說通過Mock.js我們就可以自己模拟資料和請求,而不通過背景來完成了。

使前後端分離。

要想使用Mock.js,首先第一步是安裝Mockjs依賴,

在項目cmd中輸入:

npm install mockjs -D              #隻在開發環境使用
           

即可下載下傳。

下載下傳完後在項目中引入:

在config檔案夾中的dev.env添加MOCK: ‘true’,prod.env 檔案中添加MOCK: ‘false’

dev.env
      module.exports = merge(prodEnv, {
	NODE_ENV: '"development"',
  	MOCK: 'true'
      })
           
prod.env
      module.exports = {
	NODE_ENV: '"production"',
	MOCK: 'false'
      }
           

然後在根目錄下的main.js中添加

process.env.MOCK && require('@/mock') 
           

這樣的配置是為了隻在開發環境使用mock,而打包到生産環境時自動不使用mock。

若不想用測試資料 寫要請求背景了,則在main.js‘把 process.env.MOCK && require(’@/mock’)删除即可。

測試

首先導入我寫的mock檔案:

index,js:

import Mock from 'mockjs' //引入mockjs,npm已安裝
import action from '@/api/action' //引入請求位址

//全局設定:設定所有ajax請求的逾時時間,模拟網絡傳輸耗時
Mock.setup({
	// timeout: 400  //延時400s請求到資料
	timeout: 200 - 400 //延時200-400s請求到資料
})

//引登陸的測試資料,并添加至mockjs
import loginInfo from '@/mock/json/login-mock.js'
let s1 = action.getFullPath('SYSTEM_USER_DOLOGIN')
Mock.mock(s1, "get", loginInfo)
// Mock.mock(s1, /post|get/i, loginInfo)

           

json檔案夾:

login-mock.js:

//使用mockjs的模闆生成随機資料
const loginInfo = {
	'code|0-1': 0,
	'msg|3-10': 'msg'
}
export default loginInfo;

           

還有api檔案夾中的:

action.js:

/**
 * 對背景請求的位址的封裝,URL格式如下:
 * 子產品名_實體名_操作
 */
export default {
	'SERVER': 'http://localhost:8080/SSH', //伺服器
	'SYSTEM_USER_DOLOGIN': '/vue/userAction_login.action', //使用者登陸
	'SYSTEM_USER_DOREG': '/vue/userAction_reg.action', //使用者注冊
	'SYSTEM_MENU_TREE': '/vue/treeNodeAction.action', //左側樹形菜單加載
	'SYSTEM_ARTICLE_LIST': '/vue/articleAction_list.action', //文章清單
	'SYSTEM_ARTICLE_ADD': '/vue/articleAction_add.action', //文章新增
	'SYSTEM_ARTICLE_EDIT': '/vue/articleAction_edit.action', //文章修改
	'SYSTEM_ARTICLE_DEL': '/vue/articleAction_del.action', //文章删除
	'SYSTEM_USER_GETASYNCDATA': '/vue/userAction_getAsyncData.action', //vuex中的異步加載資料
	'getFullPath': k => { //獲得請求的完整位址,用于mockjs測試時使用
		return this.SERVER + this[k];
	}
}
           

這三個檔案,主要的是index.js

他第一步是擷取攔截位址:

通過 action李的getFullPath方法獲得攔截位址,

let s1 = action.getFullPath('SYSTEM_USER_DOLOGIN')
           

然後建立一個Mock:

Mock.mock(s1, "get", loginInfo)
           

Mock.mock(url, type, data).

參數名 參數需求 參數描述 例子
url 可選: URL 字元串或 URL 正則 攔截請求的位址 s1
type 可選 攔截Ajax類型 GET、POST
template 可選:可以是對象或字元串 生成資料的模闆 loginInfo

template可能有些難了解,其實就是模拟傳回資料的類型,參數。

就比如我login-mock.js這個檔案:

const loginInfo = {
	'code|0-1': 0,
	'msg|3-10': 'msg'
}
           

參數名|傳回次數:資料類型或者内容

這裡代表的是,傳回的資料中有code和msg,

code傳回的是數字0-1之間,

msg傳回的是msg3-10次。

例:

doLogin() {
				let url = this.axios.urls.SYSTEM_USER_DOLOGIN;
				console.log(url)
				this.axios.get(url, { //注意資料是儲存到json對象的params屬性
					params: this.ruleForm
					//then相當于成功回調函數
				}).then((response) => {
					console.log(response);
					if (response.data.code == 1) {
						this.$message({
							showClose: true,
							message: response.data.msg,
							type: 'success'
						});
						this.$router.push({
							path:'/AppMain'
						})
					} else {
						this.$message({
							showClose: true,
							message: response.data.msg,
							type: 'error'
						});
					}
				}).catch((response) => {
					//carch則是異常  
					console.log(response);
				});
			}
           

效果:

Mock運用以及SPA跳轉和vue Bus總線介紹測試跳轉vue Bus總線

裡面的資料都是随機生成的,code可能等于1也可能等于0msg可能産生3次-10次。

跳轉

使用this.$router.push({})實作路由跳轉。

在Spa項目中跳轉參數分為:

1 字元串 this.$router.push(’/home/first’)

2 對象 this.$router.push({ path: ‘/home/first’ })

3 命名的路由 this.$router.push({ name: ‘home’, params: { userId: wise }})

跳轉方式:

this.$router.push()

跳轉到不同的url,但這個方法會向history棧添加一個記錄,點選後退會傳回到上一個頁面

this.$router.replace()

同樣是跳轉到指定的url,但是這個方法不會向history裡面添加新的記錄,點選傳回,會跳轉到上上一個頁面。上一個記錄是不存在的。

this.$router.go(n)

相對于目前頁面向前或向後跳轉多少個頁面,類似 window.history.go(n)。n可為正數可為負數。負數傳回上一個頁面。

vue Bus總線

意思就是将一個空的Vue執行個體放到根元件下,所有的子元件都能調用。這樣的好處就是所有的元件都能調用這個參數,

首先在main.js 裡的newVue data()中,添加Bus:new Vue({ }):

new Vue({
  el: '#app',
	data(){
		return{
			Bus:new Vue({	
			})
		}
	},
  router,
  components: { App },
  template: '<App/>'
})
           

在A元件觸發事件

this. r o o t . B u s . root.Bus. root.Bus.emit(“事件名”, 參數1, 參數2, …);

A元件中第一個是事件名,第二個之後則都是參數,

例:

this.$root.aa.$emit('collapsed-side','aa')
           

在B元件監聽事件

this. r o o t . B u s . root.Bus. root.Bus.on(“事件名”, 回調函數);

B元件中,事件名要與觸發事件中的保持一緻,回調函數則是你要改變的内容,v可能代表參數,

例:

created(){
			this.$root.aa.$on('collapsed-side',(v)=>{
				this.collapsed = v;
			});
		}
           

需要注意的是

有時候會發生事件隻被emit觸發了一次,但是回調函數卻被執行了多次的現象。這種現象往往發生在頁面跳轉退出後重新進入的時候。

産生原因:

this. r o o t . B u s . root.Bus. root.Bus.on實際是向Bus容器中添加一個事件監聽器,當頁面跳轉時,原來的vue元件被登出,但是原來vue元件向Bus容器中添加的事件監聽器并不會被移除。

是以,當下次進入這個vue元件對應的頁面時,執行到this. r o o t . B u s . root.Bus. root.Bus.on時,又會向Bus容器中添加一個重複的事件監聽器,以此類推,

導緻Bus容器中有很多個一模一樣的事件監聽器,進而導緻事件隻被觸發一次,但是回調函數被執行多次的現象。

解決方案:

在vue元件的beforeDetory鈎子函數中将本vue元件往Bus容器中添加的事件監聽器全部手動移除。

//在vue對象的methods域中定義個函數專門移除事件監聽器
        offxxxListener: function () {
            this.$root.Bus.off("事件名");
            this.$root.Bus.off("事件名");
            this.$root.Bus.off("事件名");
        },
 //在vue對象的beforeDestroy鈎子中調用以上函數
 beforeDestroy() {
     this.offxxxListener();
 },