Я пытаюсь реализовать концептуально простую проблему, но это оказывается настоящей болью.
У меня есть вложенные маршруты, которые выглядят так:
-Foo
-foo1 (default)
-foo2
-Bar
-bar1 (default)
-fubar1 (default)
-fubar2
-bar2
Foo
и Bar
- это ссылки в навигационной панели.Их прямые дочерние маршруты находятся на боковой панели, на отдельных страницах.Всякий раз, когда я направляю к ссылке на панель навигации, я хочу, чтобы их последний активный дочерний элемент был перенаправлен на.
Пример маршрутизации:
- Посещения пользователя
Foo
, foo1
активирован. - посещения пользователя
foo2
. - посещения пользователя
Bar
, bar1
активирован. - посещения пользователя
bar2
. - посещения пользователя
Foo
, foo2
активировано.(последний активный потомок Foo
направляется в) - Пользователь посещает
Bar
, bar2
активирован.(последний активный дочерний элемент Bar
направляется в)
Мое текущее решение включает средства защиты компонентов:
export default {
...,
beforeRouteEnter (to, from, next) {
next(vm => {
let lastActive = vm.$store.state.lastActivePaths[vm.$options.name]
if (lastActive) {
next(lastActive)
} else {
next()
}
})
},
beforeRouteLeave (to, from, next) {
this.$store.commit(SET_LAST_ACTIVE_PATH, {
routeName: this.$options.name,
path: from.path
})
next()
},
}
Vuex:
export default new Vuex.Store({
state: {
lastActivePaths: {},
},
mutations: {
[SET_LAST_ACTIVE_PATH](state, payload) {
let { routeName, path } = payload
Vue.set(state.lastActivePaths, routeName, path)
},
},
})
It"работает", но требует логики в 2 разных местах и может быстро стать беспорядком.Есть ли более простое решение?