小猿圈HTML5學習之基于iview的router常用控制方式

對于互聯(lián)網(wǎng)發(fā)展的今天,IT行業(yè)慢慢變成大多數(shù)年輕人發(fā)展的目標,不僅前景好,薪資也是越來越高的,而web前端是行業(yè)中需要的技術(shù),也促進了大多數(shù)朋友在學習html5,今天小猿圈講師給你分享基于iview的router常用控制方式,在學的過程中不浪費時間少走彎路。

1、iview的router控制需求

最近在使用iview框架寫項目,遇到了一些路由控制上的問題,解決過程中也有一些心得,故在此記錄下來.

每個項目在開發(fā)時,對于類似tags(標簽頁)的控制需求都不盡相同,故以下先列出本文所述項目對標簽頁的控制要求(如有不同需求,本文當也可提供一些思路):

對于同名(name)的路由標簽頁,不能打開多個.譬如說從商品列表中打開商品展示標簽頁,如果已經(jīng)有在打開的商品編輯頁面,則替換之.新打開的,未保存,已保存的標簽頁,同時只能存在一個(即不同params相同name的route只能有一個);

替換掉一個新的頁面時,通過切換的方式切換回來(先切到其他標簽頁再切換回來),仍是原來頁面的內(nèi)容(即實際記錄的params在替換后應(yīng)變化).類似的情況,還應(yīng)包含單據(jù)從未保存到已保存,以及保存并新增功能;

2、基于vue的router控制

iview是基于vue的框架,故vue本身自帶的router控制方法是必然可行的.

vue變更路由的常用方式參考以下(該方法在官方api中有更詳細的介紹):

//變更當前路由(有歷史記錄,建議使用此方式)

this.$router.push({

? name:'routerName',

? params:routerParam

})

//變更當前路由(無歷史記錄)

this.$router.replace({

? name:'routerName',

? routerParam

})

官方路由變更確實可以正常打開標簽頁,但在實現(xiàn)1中所提到的各種需求的時候,就有些不滿足需求了.為此,需要參考3中,如何基于iview的outer控制.

3、基于iview的router控制

iview在控制路由的時候,使用vuex中的app.js來記錄標簽頁路由信息,如果對vuex還是很了解的話,可以通過這篇博文來先打一下基礎(chǔ).

3.1如何實現(xiàn)需求1.1

想要實現(xiàn)不同params相同name的route在iview中只能有一個,關(guān)鍵是改變iview對路由相等的判斷方法,即'/src/libs/util.js'里的routeEqual方法:

/**

* @description 根據(jù)name/params/query判斷兩個路由對象是否相等

* @param {*} route1 路由對象

* @param {*} route2 路由對象

*/

export const routeEqual = (route1, route2) => {

return route1.name === route2.name

// 此處改變相同路由的判斷方式,改為name相同即認為相同

// const params1 = route1.params || {}

// const params2 = route2.params || {}

// const query1 = route1.query || {}

// const query2 = route2.query || {}

// return (route1.name === route2.name) && objEqual(params1, params2) && objEqual(query1, query2)

}

這里稍微解釋下(如果不關(guān)注原因,可以直接看3.2).當改變路由時,'src\components\main\main.vue'作為近乎頂層的組件控制著近乎所有的全局邏輯,其中就有對路由的監(jiān)控:

...

<side-menu

accordion

ref="sideMenu"

:active-name="$route.name"

:collapsed="collapsed"

@on-select="turnToPage"

:menu-list="menuList"

>

...

? //此方法隸屬于methods,用以監(jiān)控side-menu的選擇事件,即平時從左側(cè)菜單打開標簽頁的邏輯

? turnToPage (route) {

? let { name, params, query } = {}

? if (typeof route === 'string') name = route

? else {

? ? name = route.name

? ? params = route.params

? ? query = route.query

? }

? if (name.indexOf('isTurnByHref_') > -1) {

? ? window.open(name.split('_')[1])

? ? return

? }

? this.$router.push({

? ? name,

? ? params,

? ? query

? })

? },

...

watch: {

? // 檢測route的變化

? $route (newRoute) {

? const { name, query, params, meta } = newRoute

? this.addTag({

? ? route: { name, query, params, meta },

? ? type: 'push'

? })

? this.setBreadCrumb(newRoute)

? this.setTagNavList(getNewTagList(this.tagNavList, newRoute))

? this.$refs.sideMenu.updateOpenName(newRoute.name)

? }

},

...

從以上代碼可推測出,main.vue通過turnToPage方法實現(xiàn)打開標簽頁的邏輯,但方法內(nèi)部并沒有體現(xiàn)便簽頁顯示效果變化(包含內(nèi)部數(shù)據(jù)變化,以下同)的邏輯,這是由于顯示效果變化的邏輯,由對$router的監(jiān)控實現(xiàn).

這樣,不止從左側(cè)菜單打開新標簽頁可以實現(xiàn)顯示變化效果,其他只要使用vue的原版push等方法改變router的方法,均可監(jiān)測到.

逐步查看下各個方法,其中影響當前標簽頁顯示效果的,是'src/store/module/app.js'的addTag方法.

addTag (state, { route, type = 'unshift' }) {

let router = getRouteTitleHandled(route)

if (!routeHasExist(state.tagNavList, router)) {

? if (type === 'push') state.tagNavList.push(router)

? else {

? if (router.name === homeName) state.tagNavList.unshift(router)

? else state.tagNavList.splice(1, 0, router)

? }

? setTagNavListInLocalstorage([...state.tagNavList])

}

},

盡管方法內(nèi)部仍調(diào)用了很多,其中一個很重要的判斷,就是routeHasExist(路由是否存在),這個方法也是判斷是否為相同標簽頁的一個關(guān)鍵節(jié)點(該方法同樣在util.js):

/**

* 判斷打開的標簽列表里是否已存在這個新添加的路由對象

*/

export const routeHasExist = (tagNavList, routeItem) => {

let len = tagNavList.length

let res = false

doCustomTimes(len, (index) => {

? if (routeEqual(tagNavList[index], routeItem)) res = true

})

return res

}

明顯可以看出,這個方法內(nèi)調(diào)用routeEqual,就是用以判斷是否為相同路由的實際方法(當然是通過比較新路由與已有路由進行比較),如此,僅需改變routeEqual即可.

以防萬一,全局搜索下調(diào)用這個routeEqual的所有方法,發(fā)現(xiàn)所有調(diào)用的地方再routeEqual在改變后不會出現(xiàn)新的問題.

3.2如何實現(xiàn)需求1.2

在進行3.1的操作后,問題得到了部分解決.余下的問題在于需求1.2沒有得到實現(xiàn)和解決.

首先是,如何實現(xiàn)從列表中打開或新建的,替換原來的標簽頁,在來回切換后不會回到原來的標簽頁.只需在app.js中注冊改變標簽頁參數(shù)的方法:

// 變更指定路由的參數(shù)

changeTagParams (state, route) {

let routeOldIndex = state.tagNavList.findIndex(m => routeEqual(m, route))

if (routeOldIndex !== -1) {

? let routeOld = state.tagNavList[routeOldIndex]

? routeOld.params = route.params

? state.tagNavList.splice(routeOldIndex, 1, routeOld)

? setTagNavListInLocalstorage([...state.tagNavList])

}

},

然后在main.vue中對$route的監(jiān)控最后引用即可.

watch: {

? // 檢測route的變化

? $route (newRoute) {

? const { name, query, params, meta } = newRoute

? this.addTag({

? ? route: { name, query, params, meta },

? ? type: 'push'

? })

? this.setBreadCrumb(newRoute)

? this.setTagNavList(getNewTagList(this.tagNavList, newRoute))

? this.$refs.sideMenu.updateOpenName(newRoute.name)

? // 增加路由參數(shù)變更環(huán)節(jié)

? this.changeTagParams(newRoute)

? }

},

其次,如果出現(xiàn)像保存并新增,或者從未保存到已保存,這兩種情況來回切換后不會回到原來的情況.

保存并新增,關(guān)鍵是"新增"效果:

// 清空數(shù)據(jù),該方法在保存后調(diào)用

clearData () {

//該部分是用來清除當前route的參數(shù)

this.$router.push({

? params: Object.assign(this.$route.params, { id: undefined })

})

//這部分代碼是用來清空當前頁面內(nèi)容,每個模塊都不盡相同,不必模仿

this.mOtherExpense = JSON.parse(JSON.stringify(this.mOtherExpenseInitial))

this.tableData = [{}]

this.loadCode()

this.mOtherExpense.openingDate = new Date()

},

從未保存到已保存,關(guān)鍵同樣是如何讓route記住新的id(或其他參數(shù)):

// 設(shè)置路由id,該方法在第一次保存后調(diào)用

setData (id) {

//這里的id是保存后從后臺傳來的新id

this.$router.push({

? params: Object.assign(this.$route.params, { id })

})

}

文中已將本人常用的iviewrouter控制方式提出,或有未涉及者,根據(jù)以下了解大概也可解決:

app.js中的state.tagNavList是標簽頁中顯示的標簽集合;如果要改變一些內(nèi)容,main.vue中對$route的監(jiān)控是事件發(fā)起的開端,可考慮從這里修改;

以上就是小猿圈web前端講師對于基于iview的router常用控制方式的介紹,記住一定要練習,多學多看多練這才是學習一門新技術(shù)好的開始,如果沒有系統(tǒng)的視頻可以觀看小猿圈,里面有更完善更全的視頻。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 一、具體需求: 1. 頁面布局 左側(cè)導(dǎo)航,右側(cè)側(cè)邊輔助菜單,中間主業(yè)務(wù)界面;左側(cè)導(dǎo)航是根據(jù)用戶權(quán)限動態(tài)生成的。 2...
    環(huán)零弦閱讀 8,963評論 0 3
  • 一、前言 要學習vue-router就要知道這里的路由是什么?為什么我們不能像原來一樣直接用標簽寫鏈接?vue-r...
    圓滾滾1991閱讀 371評論 0 2
  • 一、前言 要學習vue-router就要先知道這里的路由是什么?為什么我們不能像原來一樣直接用 標簽編寫鏈接哪?...
    浪里行舟閱讀 68,154評論 12 203
  • 茶,自神農(nóng)發(fā)現(xiàn)以來,之所以成為人類最鐘愛的三大非碳酸飲品之一,一個很重要的因素在于人類基于健康訴求的生理需求。俗話...
    虔茶之旅閱讀 2,176評論 0 0
  • 要點 著名培訓師杜葵在“北京聽道講壇”做了場演講,“聽”是聽見的聽,“道”是道理的道。杜葵在演講中總結(jié)了三個和學習...
    川行天下閱讀 337評論 0 0

友情鏈接更多精彩內(nèi)容