一个关于 vue-router 中修改 vuex 内容的问题

洒家想在 vue-routerbeforeEach 全局钩子中通过获取路有对象 meta 中的内容,然后设置 vuex 中对应的信息从而达成 面包屑导航的效果。

import Vue from 'vue'
import Router from 'vue-router'
import store from '../vuex/store'

Vue.use(Router)

const routes = [
  { path: '/', name: 'home', component: require('../components/pages/Default.vue') },
  { path: '/EmployeeMGT', name: 'EmployeeMGT', component: require('../components/pages/EmployeeMGT.vue'), meta: { breadcrumbList: [ { label: '员工详情' }] } },
  { path: '/DepartmentDetail', name: 'DepartmentDetail', component: require('../components/pages/DepartmentDetail.vue'), meta: { breadcrumbList: [ { label: '部门详情' }] } },
  { path: '/SuggestionType', name: 'SuggestionType', component: require('../components/pages/SuggestionType.vue'), meta: { breadcrumbList: [ { label: '建议类型' }] } },
  { path: '/SuggestProcess', name: 'SuggestProcess', component: require('../components/pages/SuggestProcess.vue'), meta: { breadcrumbList: [ { label: '建议流程' }] } },
  { path: '/SuggestionMGT', name: 'SuggestionMGT', component: require('../components/pages/SuggestionMGT.vue'), meta: { breadcrumbList: [ { label: '建议管理' }] } },
  { path: '/CoMGT', name: 'CoMGT', component: require('../components/pages/CoMGT.vue'), meta: { breadcrumbList: [ { label: '公司管理' }] } },
]

let router = new Router({
  routes
})

// 全局 before 钩子: 进入下一个路由前, 修改 Vuex 中的 breadcrumb 内容
router.beforeEach(({ meta }, from, next) => {
  let { breadcrumbList = [] } = meta
  breadcrumbList.unshift( { label: '主页' } )
  store.dispatch('breadcrumbUpdate', breadcrumbList)
  next()
})
export default router

上面的 beforeEach 中从 meta 中获取 breadcrumbList 并补充 最前面的 主页, 然后触发 breadcrumbUpdate这个 action

actions:

export const breadcrumbUpdate = ({commit}, newCrumb) => {
  commit(BREADCRUMB_UPDATE, newCrumb)
}

mutations:

[BREADCRUMB_UPDATE](state, newCrumb) {
    state.breadcrumbList = newCrumb
  }

简单的修改breadcreumbList这个全局状态。
效果是这样的:
clipboard.png

点击另一个:
clipboard.png

但是呢,如果反复点击已经访问过的路由的时候就会出问题,
会出现这样:
clipboard.png

每次重复点击之前已经点击过的路由链接就会增加一个:
clipboard.png

很惆怅。。。

回答:

用 concat 代替 unshift,unshift 会触发 vue 的双向绑定

官方说明

回答:

其实每个路由,都是一个完整的面包屑,所以只读取就行,不用操作,当然这是写死页面名称的情况下:

路由:

{
        path: '/',
        name: 'index',
        component: Index,
        meta: {
            keepAlive: false,
            breadcrumbList: [
                {
                    name: '项目管理'
                }
            ]
        }
    },
{
    path: '/editProject/:productId&:projectId&:type',
    name: 'editProject',
    component: EditProject,
    meta: {
        keepAlive: false,
        breadcrumbList: [
            {
                name: '项目管理',
                link: '#'
            },
            {
                name: '项目编辑'
            }
        ]
    }
}

面包屑组件里面直接拿 $route.meta.breadcrumbList 就行了

暂无评论

发表评论

您的电子邮箱地址不会被公开。 必填项已用*标注