2019-05-30 13:46:39 3909浏览
今天千锋扣丁学堂HTML5培训老师给大家分享一篇关于基于iview的router常用控制方式详细介绍,希望对同学门学习VUE有所帮助,下面我们一起来看一下吧。
//变更当前路由(有历史记录,建议使用此方式)
this.$router.push({
name:'routerName',
params:routerParam
})
//变更当前路由(无历史记录)
this.$router.replace({
name:'routerName',
routerParam
})
/**
* @description 根据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)
}
...
<side-menu
accordion
ref="sideMenu"
:active-name="$route.name"
:collapsed="collapsed"
@on-select="turnToPage"
:menu-list="menuList"
>
...
//此方法隶属于methods,用以监控side-menu的选择事件,即平时从左侧菜单打开标签页的逻辑
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)
}
},
...
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])
}
},
/**
* 判断打开的标签列表里是否已存在这个新添加的路由对象
*/
export const routeHasExist = (tagNavList, routeItem) => {
let len = tagNavList.length
let res = false
doCustomTimes(len, (index) => {
if (routeEqual(tagNavList[index], routeItem)) res = true
})
return res
}
// 变更指定路由的参数
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])
}
},
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)
// 增加路由参数变更环节
this.changeTagParams(newRoute)
}
},
// 清空数据,该方法在保存后调用
clearData () {
//该部分是用来清除当前route的参数
this.$router.push({
params: Object.assign(this.$route.params, { id: undefined })
})
//这部分代码是用来清空当前页面内容,每个模块都不尽相同,不必模仿
this.mOtherExpense = JSON.parse(JSON.stringify(this.mOtherExpenseInitial))
this.tableData = [{}]
this.loadCode()
this.mOtherExpense.openingDate = new Date()
},
// 设置路由id,该方法在第一次保存后调用
setData (id) {
//这里的id是保存后从后台传来的新id
this.$router.push({
params: Object.assign(this.$route.params, { id })
})
}
【关注微信公众号获取更多学习资料】 【扫码进入HTML5前端开发VIP免费公开课】