vue-route杂谈

vue-router杂谈

简介

说到 vue-router ,首先脑海中浮现出几个对象:

1
router,routes,route

说到 route 脑海中又有了几个属性:

1
path,component,name

还有几个方法:

1
BeforeRouteUpdate(),BeforeRouteEnter(),BeforeRouteLeave(),router.beforeEach()

router 路由器,功能是根据路由表实现路由和组件的映射,可通过 go(),replace(),push() 方法做编程式路由切换。

routes 路由表,存储路由的数组。

route 路由,路由表中的元素,包含 url 地址(path)、路由名(name)、组件(component)、路由参数(params)、查询串(query) 等信息的对象。让 url 地址(path)和组件(component)形成映射关系,路由名(name)则是地址的别名 。

使用 vue-router

地址栏输入地址后,router 通过 path 查找路由表中的路由,依据路由元信息映射到 component,实现输入指定地址显示指定组件。

而使用 router.push() 等方法切换路由时,router 通过路由别名 name 找到路由,根据路由元信息映射到 component 完成路由切换。

BeforeRouteWTF(),根据文档的说法,这个玩意称作导航守卫。“导航”意为路由发生变化,“守卫”意为声明周期回调(句柄)。

当参数或查询改变时,不会触发进入/离开的导航守卫,而会触发更新的导航守卫。所以,进入/离开守卫与更新守卫是互斥的。

当path的查询和参数被修改时,进入 BeforeRouteUpdate();当查询和参数未被修改,或path被修改时,进入 BeforeRouteEnter()BeforeRouteLeave()

因此

路由变更有两种:路由修改路由切换

前者复用实例,后者销毁并创建新实例

关于路由切换时,watch route 无法触发这个问题,我的解释是这样的:组件实例被销毁,是对响应式对象的直接销毁,watch 无法追踪。