Vue-router 2 изменяет маршрут, но не обновляет вид?
У меня есть проблема входа с веб-сайтом, который использует:
- Vue.js v2.0.3
- vue-router v2.0.1
- vuex v0.8.2
В routes.js
У меня есть простая настройка перехватчика
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
// this route requires auth, check if logged in
// if not, redirect to login page.
if (!router.app.auth.isUserLoggedIn) {
next({
path: '/login',
query: { redirect: to.fullPath }
})
} else {
next()
}
} else {
next() // make sure to always call next()!
}
})
И в login.vue
, который обрабатывает логин логина входа после использования API Google только для успешного входа в систему, я вызываю это:
this.login(userData).then(
() => this.$router.push(this.redirectToAfterLogin), // Login success
() => {} // Login failed
)
mounted: function(){
if (this.auth.isUserLoggedIn){
// Let just redirect to the main page
this.$router.push(this.redirectToAfterLogins)
}else{
Vue.nextTick(() => {
this.loadGooglePlatform()
})}}
computed: {
redirectToAfterLogin: function() {
if (this.$route.query.redirect){
return this.$route.query.redirect
}else{
return '/'
}
}
}
router.js
var VueRouter = require('vue-router')
// Router setup
export const router = new VueRouter({
linkActiveClass: "is-active",
mode: 'history',
saveScrollPosition: true,
routes: [
{ path: '', name: 'root', redirect: '/home' },
{ path: '/login', name: 'login', meta: { loadingNotRequired: true }, component: require('./pages/login.vue') },
{ path: '/logout', name: 'logout', meta: { loadingNotRequired: true }, component: require('./pages/logout.vue') },
{ path: '/home', name: 'home', title: 'Home', redirect: '/home/random', component: require('./pages/home.vue'),
children: [
{ path: 'random', name: 'random', meta: { requiresAuth: true }, title: 'Random', component: require('./pages/random.vue') }
]
}
]
})
// Redirect to login page if not logged In
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiresAuth)) {
// this route requires auth, check if logged in
// if not, redirect to login page.
if (!router.app.auth.isUserLoggedIn) {
next({
path: '/login',
query: { redirect: to.fullPath }
})
} else {
next()
}
} else {
next() // make sure to always call next()!
}
})
Теперь здесь this.login
- это просто вызов vuex, чтобы обновить зарегистрированного пользователя.
Случается, что после входа в систему URL изменяется на /home, но DOM не обновляет!
Только способ, который успешно изменил DOM, заставлял location.reload()
, и это не то, что я хочу сделать, поскольку он теряет мои динамически загруженные сценарии G в Head.
Любая идея о том, что делать, чтобы заставить просмотр обновить DOM?
ПРИМЕЧАНИЕ: это происходит только при первом входе в систему пользователя, если он выходит из системы и возвращается, перенаправление в порядке
Ответы
Ответ 1
Может быть не идеальным решением, так как он собирается воссоздать компонент, но он будет работать для каждого случая, когда есть один и тот же маршрут и нужно обновить компонент.
Просто обновите <router-view/>
или <router-view></router-view>
с помощью
<router-view :key="$route.fullPath"></router-view>
Ответ 2
Возможно, вам следует установить функцию redirectToAfterLogin в методы, как это будет пересчитываться каждый раз. Вычисленное будет изменено только в случае изменения используемой v-модели. Чтобы придерживаться значения имени функции, я бы установил толчок маршрутизатора внутри.
login.vue:
mounted: function(){
if (this.auth.isUserLoggedIn){
// Let just redirect to the main page
// this.$router.push(this.redirectToAfterLogins)
this.redirectToAfterLogins()
}else{
Vue.nextTick(() => {
this.loadGooglePlatform()
})
}
},
// computed: {
methods: {
this.login(userData).then(
// () => this.$router.push(this.redirectToAfterLogin), // Login success
() => this.redirectToAfterLogin(), // Login success
() => {} // Login failed
),
redirectToAfterLogin: function() {
if (this.$route.query.redirect){
// return this.$route.query.redirect
this.$router.push(this.$route.query.redirect)
}else{
// return '/'
this.$router.push('/')
}
}
}
"Однако отличие состоит в том, что вычисляемые свойства кэшируются на основе их зависимостей. Вычисленное свойство будет переоцениваться только при изменении некоторых его зависимостей. Это означает, что до тех пор, пока сообщение не изменилось, множественный доступ к вычисляемому свойству reversedMessage будет немедленно вернуть ранее вычисленный результат без необходимости повторного запуска функции. "
методы против вычисляемых и фильтры:
Ответ 3
Vue повторно использует компоненты, где это возможно. Вы должны использовать beforeRouteUpdate
для реагирования на коммутатор маршрута, который использует тот же компонент.
Ответ 4
У меня та же проблема "URL-адрес меняется на /home, но DOM не обновляется".
В моем проекте тег "переход" создал проблему.
Надеюсь, это полезно!
Ответ 5
Возможно, в router.push есть некоторая ошибка, вы можете попробовать заменить "to.matched.some(record = > record.meta.requiresAuth)" с помощью "to.meta.requiresAuth === true"