我可以向beforeDestroy
添加内容以防止破坏组件吗? ?
或者有什么方法可以防止破坏组件吗?
我的情况是,当我通过vue-route更改spa页面时,我首先使用watch route,但我发现它不会触发,因为组件只是破坏..
答案 0 :(得分:3)
您可以使用vue-route navigation-guards,因此如果您在挂钩内拨打router.afterEach((to, from) => {
if(your condition){
next(false) //this will abort route navigation
}
})
,导航将会中止。
req.flash('error', yourErrString);
res.render("register.ejs", {
message: req.flash('error')
});
答案 1 :(得分:2)
如 belmin bedak 所述,您可以使用keep-alive
当您使用keep-alive
两个生命周期挂钩开始行动时,它们是activated
和deactivated
挂钩而不是destroyed
keep-alive
的目的是缓存和不破坏组件
您可以使用include
元素的exclude
和keep-alive
条件,并提及要包含的要缓存的组件的名称,并将其从缓存中排除。这是documentation
如果你想要优先破坏组件,即使它已被缓存,你可以使用vm.$destroy()
here
此外,您可以在所有生命周期挂钩中console.log
并检查正在调用哪个生命周期挂钩
答案 2 :(得分:2)
根据此来源:https://router.vuejs.org/guide/advanced/navigation-guards.html
我建议你用你的 Vue 路由器做这样的事情:
const router = new VueRouter({ }); // declare your router with params
router.beforeEach((to, from, next) => {
if(yourCondition){
next(false); // prevent user from navigating somewhere
} else {
return next(); // navigate to next "page" as usual
}
});
这将防止在您声明的条件下破坏您的 Vue 实例,并且还将防止用户导航到另一个页面。
答案 3 :(得分:0)
尽管我认为@Vamsi Krishna的“ keep-alive”答案是解决此问题的正确“ VueJS方式”,但我不愿意为此重构代码的一部分。
我也无法使用“原样”的Vue路由器导航防护,因为在beforeRouterLeave
的情况下,即使使用next(false)
也阻止了路由的继续,但Vue中的组件已经存在毁了。我原来没有保存的任何状态都会丢失,这违背了取消路线更改的目的。
这不是我想要的,因为我需要保留组件中表单/设置的状态(组件重新加载自身并保持相同的路径)。
因此,我想出了一种策略,该策略仍然使用导航保护,但是还缓存了我在内存中的组件中进行的任何表单更改/设置。我在组件中添加了一个beforeRouteLeave钩子:
beforeRouteLeave (to, from, next) {
if (!this.isFormDirty() || confirm('Discard changes made?')) {
_cachedComponentData = null // delete the cached data
next()
} else {
_cachedComponentData = this.componentData // store the cached data based on component data you are setting during use of the component
next(false)
}
}
在Vue组件之外,我初始化_cachedComponentData
<script>
let _cachedComponentData = null
module.exports = {
...component code here
}
<script>
然后在生命周期挂钩created
或mounted
中,我可以在组件中将_cachedComponentData
设置为“继续用户离开的地方”:
...
if (_cachedComponentData) {
this.componentData = _cachedComponentData
}
...