Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >[ Vue ] 通过使用 Vue-Router 梳理通用知识点

[ Vue ] 通过使用 Vue-Router 梳理通用知识点

原创
作者头像
GavinUI
修改于 2021-07-19 15:39:08
修改于 2021-07-19 15:39:08
1.6K0
举报
文章被收录于专栏:GavinUIGavinUI

Vue Router 的作用

实现基本的组件之间的路由

vue 是 Vue Router 是 Vuejs 官方的路由器,他和 Vue.js 深度集成,是用于单页应用中组件之间的导航,本质上就是通过 components 和 router 进行映射绑定,使用 router-link 传入指定的组件地址,通过 router-view 渲染已经和组件地址绑定好的组件。

代码语言:txt
AI代码解释
复制
<template>
  <div>
    <router-link to="/index/login">login</router-link>
    <router-link to="/index/search">search</router-link>
    <router-view></router-view>
  </div>
</template>

Vue Router 的开发要点

多层级嵌套路由

再实际的项目的开发中,肯定是有多层级的页面。配置多层级的路由就是给上一级路由增加 children 在参数,在 children 添加新的路由信息

代码语言:txt
AI代码解释
复制
  routes: [
  { 
    path: "/index", 
    component: renderView,
    children: [
      {
        path: "index",
        name: "name",
        component: Index,
        children:[
          { 
            path: "product",
          	name: "product",
          	component: Product,
          }
        ]
      },
      {
        path: "login/:user/comic/:age",
        name: "name",
        component: Login,
      },
      {
        path: "search",
        name: "search",
        component: Search,
      },
      {
        path: "*",
        name: "rank",
        component: Rank,
      },
    ],
  },
],

一个路由就是一个 Object ,如果有下一层级,就在里面加上一个 children 数组。

获取 URL 参数和配置默认路由地址

获取 URL 的参数是 router 的 path 里面加上 : 号,用来区分是一个动态的参数。在 render 组件的时候,执行 this.$route.params 就可以获取到动态传递的参数。

代码语言:txt
AI代码解释
复制
// router.js
{
  path: "comic/:id/chapter/:id",
  name: "name",
  component: Comic,
},

// component.vue
console.log(this.$route.params);
//{ comic:123, chapter:456 }

而默认路由地址,这个一般会是设置成主页或者 404 的情况,就是在找不到 URL 的地址是映射到什么组件的情况下,跳转到 404 页面或者是统一跳转到首页。一般情况下,是会跳转到 404 。然后把这个配置的映射放在了 router 的最后一项。

代码语言:txt
AI代码解释
复制
// router.js
......
{
  path: "search",
  name: "search",
  component: Search,
},
{
  path: "*",
  name: "rank",
  component: Rank,
},

JavaScript 执行路由跳转

JavaScript 执行路由跳转这个是我自己的说法,官网给出的说法是叫作编程式路由 。一开始看到这个词逼格很高,但看完解释就是代码操作路由跳转。最后,还是按我自己的理解来把这个标题定为 JavaScript 执行路由跳转。在 Vue Router 中,有两种执行路由跳转的方式,第一种是声明式,第二种是编程式。

声明式:

代码语言:txt
AI代码解释
复制
<router-link to="/index/login">login</router-link>

通过 router-link 标签执行指定跳转。

编程式:

代码语言:txt
AI代码解释
复制
// vue 
this.$router.push()
this.router.push({ name: 'user', params: { userId }}) // -> /user/123
this.router.push({ path: `/user/${userId}` }) // -> /user/123

// router 
router.push(...);

在 vue 实例中,可以通过 $router 访问路由,可以直接使用 this.$router.push() 进行操作。在使用的时候需要注意的一点就是,当有 path 的时候, params 会被忽略。所以需要像上面一样以字符串形式拼接 URL。

与 router.push 相似的还有 router.replace,他们之间唯一不同的地方就是, router.replace 会替换掉当前的历史记录。这个和 location.href 和 location.replace 是类似的。而官网最后也提到了,router.push、 router.replace 和 router.go 跟 window.history.pushState、 window.history.replaceState 和 window.history.go (opens new window)好像, 实际上它们确实是效仿 window.history API 的。

路由名称和多视图展示

路由命名只需要在 router 中在 path 同级下增加一个 name,之后使用 router.path ( name: index ,..)

即可。

代码语言:txt
AI代码解释
复制
	// set
  routes: [
    {
      path: '/index/:Id',
      name: 'index',
      component: Index
    }
  ]
  // link
  router.push({ name: 'index', params: { Id: 123 } })

多视图展示 ,实质上就是增加 router-view 的标签,再通过 router 的 component 增加视图的名称。

代码语言:txt
AI代码解释
复制
<div>
  <router-view class="one" name="one"></router-view>
  <router-view class="two" name="two"></router-view>
</div>
代码语言:txt
AI代码解释
复制
  routes: [
    {
      path: '/',
      components: {
        default: Index,
        one: Search,
        two: Details,
      }
    }
  ]

重定向 URL

使用 redirect 参数,对 URL 进行替换 , 重定向的场景一般适用于兼容的情况下,比如项目改造升级,原有的 URL 如果希望保持不变,那么就可以用重定向指向新的 URL 。

代码语言:txt
AI代码解释
复制
  routes: [
    { path: '/index', redirect: '/index/index' }
  ]

还有一个方法是叫别名,但是这个一般我没有使用,总感觉这样的方法会留下一些潜规则,所以一直不会使用这个方法,他的原理就是 URL 不变,但却走了另一个映射。

路由组件传参

在组件中使用 $route 会使之与其对应路由形成高度耦合,从而使组件只能在某些特定的 URL 上使用,限制了其灵活性。

以对象模式通过 props 进行解耦

代码语言:txt
AI代码解释
复制
  routes: [
    { path: '/user/:id', component: User, props: true },
    {
      path: '/user/:id',
      components: { default: User, sidebar: Sidebar },
      props: { default: true, sidebar: false }
    }
  ]

以函数模式

代码语言:txt
AI代码解释
复制
routes: [
    {
      path: '/search',
      component: Search,
      props: route => ({ query: route.query.name })
    }
  ]

vue-router 钩子函数

vue-router 的钩子函数也叫导航守卫。这里有三种守卫类型,第一种是全局前置守卫

代码语言:txt
AI代码解释
复制
const router = new VueRouter({ ... })
router.beforeEach((to, from, next) => {
  console.log(to)
})

导航在出发的时候它都会执行。这里有一点要注意是,确保 next 函数在任何给定的导航守卫中都被严格调用一次。它可以出现多于一次,但是只能在所有的逻辑路径都不重叠的情况下,否则钩子永远都不会被解析或报错。

代码语言:txt
AI代码解释
复制
// BAD
router.beforeEach((to, from, next) => {
  if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
  // 如果用户未能验证身份,则 `next` 会被调用两次
  next()
})
代码语言:txt
AI代码解释
复制
// GOOD
router.beforeEach((to, from, next) => {
  if (to.name !== 'Login' && !isAuthenticated) next({ name: 'Login' })
  else next()
})

第二种是全局解析守卫,这个和全局前置守卫差不多,唯一的区别就是在导航确认之前所有的守卫和异步路由组件被解析后执行。

最后一种是全局后置钩子,这个和前面不同的是,这个钩子没有 next 函数体。

代码语言:txt
AI代码解释
复制
router.afterEach((to, from) => {
  console.log(to)
})

除了全局守卫之外还有路由独享的路由,他的用法就是在 routes 里面加上 beforeEnter。

代码语言:txt
AI代码解释
复制
  routes: [
    {
      path: '/index',
      component: Index,
      beforeEnter: (to, from, next) => {
        // ...
      }
    }
  ]

还有一个组件内的守卫,他的方法是写在组件里面的。他也有三个方法,后面会有一个具体例子。

代码语言:txt
AI代码解释
复制
const Index = {
  template: `...`,
  beforeRouteEnter(to, from, next) {
  },
  beforeRouteUpdate(to, from, next) {
  },
  beforeRouteLeave(to, from, next) {
  }
}

在导航之前加载数据

像以往获取数据的方法一般是写在了组件的函数里面,也就是导航完成后,执行数据的拉取。那么,还有另一种方法就是,在导航之前加载数据。

它的原理就是我们在组件的 beforeRouteEnter 守卫中获取数据,当数据获取成功后只调用 next 方法。

代码语言:txt
AI代码解释
复制
import { ajax } from '../../js/common/ajax-helper';
export default {
  data() {
    return {
      num: 1
    }
  },
  // 方法一
  beforeRouteEnter(to, from, next) {
    console.log(to)
    console.log(window.location.href)
    ajax(to.params.id, (err, post) => {
      next(vm => vm.setData(err, post))
    })
  },
  // 方法二
  beforeRouteUpdate (to, from, next) {
    this.post = null
    ajax(to.params.id, (err, post) => {
    this.setData(err, post)});
    next();
  },
  methods: {
    setData(err, num){
      this.num = num;
      console.log(this.num)
    }
  }
}

vm 是当前实例,在进入这个路由之前获取 to.params.id ,发送请求拿到数据之后,通过 next 执行将数据挂载。

方法二是已经到了路由更新之前的阶段,可以直接通过 this 执行组件代码。执行完毕再执行下一步

路由器 lazyload

我们需要将不同路由对应的组件分割成不同的模块,然后在路由在被访问的时候才加载对应的组件,这样能够大大降低页面性能的损耗。

代码语言:txt
AI代码解释
复制
const Index = () => 
	import(/* webpackChunkName: "Index" */ './Index.vue');
const Search = () =>
	import(/* webpackChunkName: "Search" */ './Search.vue');
const Details = () => 
	import(/* webpackChunkName: "Details" */ './Details.vue')

const router = new VueRouter({
  routes: [{ path: '/Details', component: Details }]
});

这里其实也是 vue 和 webpack 结合使用的功能,到了新的 vite 工具可能会使用新的一些方法可以后面再了解下。

导航报错

这里引用一段 DEMO 的代码,也是比较简单。

代码语言:txt
AI代码解释
复制
import VueRouter from 'vue-router'
const { isNavigationFailure, NavigationFailureType } = VueRouter

router.push('/admin').catch(failure => {
  if (isNavigationFailure(failure, NavigationFailureType.redirected)) {
    showToast('Login in order to access the admin panel')
  }
})

结语

使用 vue-router 最好的方法还是阅读文档,若换一个 React 又有属于它的插件,虽说,大致的逻辑不会相差太远,但肯定是另外一套写法。所以,在理解了一个插件的实现功能之后去理解下一个类似的插件就可以带着一些问题去了解它,理解起来就会更容易上手也能对插件之间进行对比和选型。

在下次接触 react 的路由插件可以从这几个点去思考

  1. 实现基本的组件之间的路由
  2. 多层级嵌套路由
  3. 获取 URL 参数和配置默认路由地址
  4. JavaScript 执行路由跳转
  5. 路由名称和多视图展示
  6. 重定向 URL
  7. 路由组件传参
  8. 钩子函数的使用

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Vue3学习笔记(五)——路由,Router
SPA 指的是一个 web 网站只有唯一的一个 HTML 页面,所有组件的展示与切换都在这唯一的一个页面内完成。
张果
2022/11/30
8.8K0
Vue3学习笔记(五)——路由,Router
一文详解:Vue3中使用Vue Router
为了便于我们后面代码维护和管理,我们一般将路由相关的代码统一放到一个文件夹中。因此,配置Vue Router的步骤如下:
九仞山
2023/10/14
4.4K0
Vue学习-Vue router
在配置Vue-router时有两种模式,分别为:hash模式(默认)、history模式。
花猪
2022/02/17
4.6K0
Vue学习-Vue router
Vue-router 基础用法
组件复用时嵌套,局部组件更新时,容器create不动,可以通过监听$route变化实现
Cellinlab
2023/05/17
2150
vue路由详解(知识点重温)
  在router文件夹的index.js文件的new VueRouter({routers:[{ path..}]})里的配置
隔壁老陈
2023/03/09
8130
Vue-router从入门到弃坑
html页面(依次引入vue.js,router.js以及个人配置的app.js)
十月梦想
2018/10/09
2K0
vue2进阶篇:vue-router之两个新的生命周期钩子
最开始我们学习使用的是mounted和beforeDestroy的钩子函数,但是在路由组件由News切换成Messgae时被切换的组件并没有销毁,如图1,而使用activated和deactivated钩子函数正确展示结果如图2
刘大猫
2024/10/10
1860
一篇关于 Vue-Router 路由模式的整理
1、Vue-Router三种路由模式: hash:使用URL hash 值来做路由,支持所有路由器; history: 依赖HTML5 History API和服务器配置; abstract: 支持所有JS运行环境,Node.js服务端; 1.1、路由作用:根据不同的路径,来映射到不同的视图; 1.2、路由基本使用: <div id="app"> <h1>Hello kuishou!</h1> <p> <!--<router-link>默认会被渲染成一个`<a>`标签-->
前端达人
2021/08/12
6780
Vue-Router基础使用
作为Vue生态系统里面的一大成员,Vue-Router主要负责vue中的页面路由及其传值问题。
木子墨
2018/09/13
5910
vue-router详解[通俗易懂]
要学习vue-router就要先知道这里的路由是什么?为什么我们不能像原来一样直接用<a></a>标签编写链接哪?vue-router如何使用?常见路由操作有哪些?等等这些问题,就是本篇要探讨的主要问题
全栈程序员站长
2022/09/14
3.9K0
vue-router详解[通俗易懂]
Vue-router 学习笔记
在以前,前后端是不分离的,这个阶段通常是由服务端渲染好页面(SSR),再发送页面给前端去展示;接着到了前后端分离的阶段,前端向静态资源服务器拿资源,再通过 js 渲染页面,此时仍然是一个 url 对应一份 html+css+js。再后来出现了 SPA 单页面应用的概念,实际上它只有一个页面,但给我们的体验是多页面之间的切换。
Chor
2019/11/18
7000
vue-router(路由)详细教程
如果你用vue-cli脚手架来搭建项目,配置过程会选择是否用到路由(详细见vue-cli 脚手架),如果选择y,后面下载依赖会自动下载vue-router。 这里还是说一下安装:npm install vue-router
全栈程序员站长
2022/09/08
3.3K0
vue-router(路由)详细教程
vue之vue-router实例
本文转自: https://www.cnblogs.com/SamWeb/p/6610733.html
山行AI
2019/07/30
2K0
vue之vue-router实例
vue2笔记12 router路由
添加replace属性,导航时使用新地址替换当前导航历史记录,而不是压入历史记录栈
路过君
2022/04/13
7230
vue-router 用法详解
将组件(components)映射到路由(routes),然后告诉 vue-router 在哪里渲染它们。
青梅煮码
2023/01/31
2.7K0
vue-router 的基本使用
vue-router 官方文档: https://router.vuejs.org/zh
很酷的站长
2022/12/28
7520
vue-router 的基本使用
vue-router详解及实例
用户进行了交互操作,现在要对页面内容进行变更,可以通过javascript进行动态替换DOM,但是其不便于分享、收藏,对于搜索引擎和用户来说都是不友好的!
奋飛
2019/08/14
3.1K0
vue-router详解——小白速会
一、概述 vue-router是Vue.js官方的路由插件,它和vue.js是深度集成的,适合用于构建单页面应用。 vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。 而传统的多页面应用,是用一些超链接来实现页面切换和跳转的。在vue-router单页面应用中,则是路径之间的切换,也就是组件的切换。 路由中有三个基本的概念 route, routes, router。 1. route,它是一条路由,由这个英文单词也可以看出来,它是单数, Home按钮  => home内容
柴小智
2018/04/16
1.7K0
vue-router详解——小白速会
2020前端技术面试必备Vue:(二)Router篇
前两章陆续已经更新了Vue的基础入门篇文章和Vue组件篇文章,本章将更新Vue Router 篇,前两篇掌握差不多了,你可以开发单页面应用,所有数据都在一页呈现出来,不能跳转,体验很差。学习了本篇文章后,你可以实现一个精美的Web应用了,本章将会介绍到路由的跳转实现,路由的动态传递参数,路由的守卫.......
程序员海军
2021/10/11
8250
2020前端技术面试必备Vue:(二)Router篇
vue2进阶篇:vue-router之使用“全局路由守卫”
前置路由守卫或者后置路由守卫中,to指代切换到哪个路由组件,from指代从哪里来的路由组件,next指代下一个路由组件是否放行显示
刘大猫
2024/10/10
3160
相关推荐
Vue3学习笔记(五)——路由,Router
更多 >
交个朋友
加入前端学习入门群
前端基础系统教学 经验分享避坑指南
加入腾讯云技术交流站
前端技术前沿探索 云开发实战案例分享
加入云开发企业交流群
企业云开发实战交流 探讨技术架构优化
换一批
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档