vue编程式导航

178 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第14天,点击查看活动详情juejin.cn/post/714765…

编程式导航

调用方法来切换组件
除了使用router-link创建a标签来定义导航链接,我们那还可以借助router的实例方法,通过编写代码来实现。
想要导航到不同的URL,则使用router.push方法。这个方法回想history栈添加一个新的记录,所以,当用户点击浏览器后退按钮时,则回到之前的URL。
当你点击router-link时。这个方法会在内部调用,所以说,点击<router-link :to=“...”>等同于调用router.push(...)
示例如下:
下面router对象已经配置好了的,但是写的东西太多了,可以看上一个文章
image.png
该方法的参数可以是一个字符串路径,或者是一个描述地址的对象。例如:
字符串:

image.png
对象:

image.png
router.push()有历史记录
router.replace()没有历史记录

命名路由

路由组件里面的name属性,起名字在路由当行的时候用。如下:

image.png
注意 name的值不能重复

命名视图

router-view可以展示多个视图

image.png

image.png
上图实例中如果没有name的话默认是default。

  • 上面示例的整体思路是:在根组件上通过一个点击事件触发方法,在该方法函数内部,进行跳转切换路由组件,通过this.$router.push/replace(路径)来进行切换。切换的页面展示通过router对象里的components对象里的键值对(自定义属性名和对应的路由组件)来设置。例如上面的例子,如果出口router-view的name的值只有left,namecomponents里面所有的right属性对应的组件都不会被展示出来。

重定向

类似于呼叫转移一样。通过redirect

image.png 也可以这样写:

image.png

别名

给同一个组件起了两个名字,访问的时候都是该组件(跟大名小名一样),通过在router对象里添加alias属性。

image.png

路由传参

  1. 动态路由参数params(前面讲了,上一章,通配符传值)
  2. query
  3. hash 都由$route来接收(但会造成强耦合) 通过query传值的(查询字段传值):

image.png

image.png

image.png
hash/query传值的话router对象那不能有通配符

image.png

image.png
注意因为都是通过route来接收,所以导致耦合度特别高,限制了灵活性,所以可以不同route来接收,所以导致耦合度特别高,限制了灵活性,所以可以不同route来接收,而是用props来接收。因为它是最基础的传值方法。(以属性传值的方式进行传值)

image.png

image.png

image.png

image.png

image.png

image.png

进阶

导航守卫(重要):
导航:表示卢有正在发生改变,就会有守卫来监听。(监听路由的改变)导航的改变触发一系列函数(像是路由的生命周期一样)。
全局前置守卫(任何一个组件都会触发):
是一个方法 router对象上的方法。router.beforeEach()
作用:当一个当行触发时,全局前置守卫按照创建顺序调用。守卫是异步解析执行,此时导航在所有守卫resolve玩之前一致处于等待中。在路由组件渲染之前。
接收三个参数:

  1. to:即将进入目标的路由对象,要打开的那个路由对象
  2. from:离开的那个路由对象
  3. next:实际上是一个方法,一定要调用这个方法,用于说明这个方法执行完了,可以往下执行。否则会卡住不动。可以直接next()表示继续往下执行。next(false)表示中断当前导航,停在这。下一个路由组件打不开,停在from这个组件(比如:登录组件,可以在此时做判断,如果登陆成功就跳转,如果没成功阻止跳转)。next(‘路径’)类似于重定向,会直接切换组件。 image.png
    全局解析守卫:很少用。在所有组件内守卫和异步路由组件被解析之后,他才会调用。
    全局后置钩子:在组件已经渲染之后触发的。afterEach()
    路由独享守卫:某个路由独享的守卫。

image.png

image.png
组件内的守卫:可以在路由组件内直接定义以下路由导航守卫
beforeRouteEnter:渲染真实DOM之前会触发。
beforeRouteUpdate:更新的时候触发,在当前路由改变,但是该组件被复用时调用。监听路由传值变化。除了watch的监听方法。
beforeRouteLeave:离开时触发。

image.png
区别。所有的全局守卫使用与所有组件。任何一个路由的变化都会导致全局钩子函数的触发。独享守卫只针对于某一个或某几个路由组件。组件内的守卫是路由组件都渲染完毕了,守卫开始执行,也是针对于某一个组件的