2019-05-30 13:46:39 3876浏览
今天千锋扣丁学堂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免费公开课】