• VueRouter学习日志


    1.入门


    理解:
    1.Vue-Router是Vue.js官方的路由插件,它和vue.js是深度集成的,适用于构建单页面应用。vue的单页面应用是基于路由和组件的,路由用于设定访问路径,并将路径和组件映射起来。传统的页面应用,是用一些超链接实现页面切换和跳转的。在vue-router中,则是路径之间的切换,也就是组件间的切换。路由模块的本质  就是建立起url和页面之间的映射关系。
    因为Vue做的是单页应用,就相当于只有一个主的index.html页面==>a标签不起作用

    2.route,routes,router
    route:首先它是个单数,我们可以理解为单个或某个路由
    routes:它是个复数,表示多个集合才能为复数,即我们可以理解为多个路由的集合,routes表示多个数组的集合。
    router:这个是路由器,用于管理上面两个路由,路由器会去路由集合中找对应的路由

    代码:

    1. <div id="app">
    2. //1.router-link 中用于进行导航  to用于指定链接
    3. //2.router-view 是路由出口 显示router-link中的url对应的组件
    4.   <router-link to="/">go to Homerouter-link>
    5.   <router-link to="/about">go to Aboutrouter-link>
    6.   <router-view>router-view>
    7.  div>

    1. //1.定义一些路由组件,也可以从其他文件中导入
    2.  const Home={template:'
      Home
      '
      },
    3.  const About={template:'
      About
      '
      }
    4.  //2.定义一些路由  每个路由都需要映射到一个组件
    5.  const routes=[
    6.     {path:'/',component:Home},
    7.     {path:'/about',component:About},
    8.  ]
    9.  //3.创建路由实例并传递'routes'配置
    10.  const router=VueRouter.createRouter({
    11.      
    12.      //4.内部提供了history模式的实现
    13.      history:VueRouter.createWebHasHistory(),
    14.      routes,
    15.  })
    16.  //5.创建并挂载根实例
    17.  const app = Vue.createApp({})
    18. //6.通过调用app.use(router)使得我们可以在任意组件中以this.$router形式访问它,并且以this.$routes的形式访问当前路由
    19.  app.use(router)
    20.  app.mount('#app')

    2.动态路由匹配


     1.带参数的动态路由匹配
     需要将给定匹配模式的路由映射到同一个组件
     比如说:有一个User组件,它应该对所有的用户进行渲染,但是用户Id不同      因此在VueRouter中,我们可以使用一个动态字段来实现 ==>路径参数
     

    1. const User = {
    2.       template:'
      User
      '
      ,
    3.   }
    4.   const routes = [
    5.       {path:'/users/:id',component:User},
    6.   ]

    动态字段以:开始,路径参数用:表示。当一个路由被匹配时,它的params的值将在每个组件中

    this.$route.params的形式暴露出来 ==>可以通过更新User的模板来呈现当前用户的ID 

    1. const User = {
    2.       template:'
      User{{$route.params.id}}
      '
    3.   }

      2.响应路由参数的变化:
      使用带有参数的路由时需要注意的是,当用户从/users/johnny导航到/users/jolyne时,相同的组件实例将被重复使用,因为两个路由都渲染同个组件,比起销毁再创建,复用更加高效。但是这意味这组件的生命周期钩子函数不会被调用。

    1. const User = {
    2.     template:'...',
    3.     created(){
    4.         this.$watch(
    5.             //要对同一个组件中的参数变化做出响应,可以简单的watch $route对象上的任意属性
    6.             () =>this.$route.params,
    7.             (toParams,previousParam)=>{
    8.                 //对路由变化做出响应
    9.             }
    10.         )
    11.     }
    12.   }

     

    3.嵌套路由:

    1. <div id="app">
    2.       <router-view>router-view>//这里的router-view是顶层
    3.   div>


    对应的路由组件 

    1. const User = {
    2.       template:'
    3.       
    4.           

      User{{$route.param.id}}

    5.           //这里是app渲染的组件在渲染下一层组件
    6.       
      '
  •       
  •   }
  • const routes = [{path:'/user/:id',component:User}]
  •   要想实现路由组件,要在路由中配置childeren:
     

    1. const routes = [
    2.   {
    3.       path:'/user/id',
    4.       components:User,
    5.       children:[
    6.           {
    7.               path:'profile',
    8.             component:UserProfile,
    9.           },
    10.           {
    11.               path:'posts',
    12.               component:UserPosts,
    13.           },
    14.       ],
    15.   },
    16. ]

    注意:以/开头的嵌套路劲将被视为根路径  这允许你利用组件嵌套  而不必使用url

    还有一些vue-router低级部分没有看  比如vue-router命名等  这个没必要看 看了也不记得 直接用就好 

    4.导航守卫

    Vue 导航守卫_许你今世繁华的博客-CSDN博客_vue导航守卫

    vue导航守卫_摩羯座**的博客-CSDN博客_vue导航守卫

    VueRouter提供的导航守卫主要用于在导航的过程中重定向或取消路由,或添加权限验证,数据获取等业务逻辑===>监听每一个路由跳转的过程,然后提供一些钩子函数让你有机会在跳入过程中植入相关信息

    导航守卫的分类(这三个守卫可以用于路由导航过程中的不同阶段):

    1. 全局守卫(全局前置守卫,全局解析守卫,全局后置钩子)
    2. 路由守卫(路由独享守卫)
    3. 组件内守卫(加载,离开,更新)

    每一个导航守卫都有三个参数:to、from和next。

    • to:表示即将进入的目标路由对象
    • from:当前导航正要离开的路由对象
    • next:函数,以下是next的常用方法
    • next(): 进行管道中的下一个钩子
    • next(false): 中断当前导航
    • next( ./xx ): 中断当前导航,并跳转至设置好的路径

    1.全局前置守卫:

    当一个导航触发时,全局前置守卫按照创建的顺序调用。守卫可以是异步解析执行,此时导航在所有守卫解析完之前一直处于挂起状态。全局前置守卫使用router.beforeEach()注册

    特点:可以拦截页面跳转

     执行时间:在页面跳转完成之前 

    参数:to表示即将前往页面对应的路由对象,系统自动注入 // from 表示即将离开页面的路由对象,系统自动注入

    1. const router = new VueRouter({....});
    2. router.beforeEach((to,from,next)=>{
    3. // 用户验证登录身份
    4. if (to.name != 'Login' && !isAuthenticated) next({ name: 'Login' })
    5. else next();
    6. })

    2.全局解析守卫

    全局解析守卫是vue-router2.5.0版本新增的,使用【router.beforeResolve】注册。它和【router.beforeEach】类似,区域在于,在导航被确认之前,在所有组件内守卫和异步路由组件被解析之后,解析守卫被调用。

    特点:可以拦截页面跳转

    执行时间:在页面跳转完成之前 

    参数:to 表示即将前往页面对应的路由对象,系统自动注入// from 表示即将离开页面的路由对象,系统自动注入 // next 路由跳转方法

    1. const router = new VueRouter({....});
    2. router.beforeResolve((to,from,next)=>{
    3. //这里执行具体操作
    4. //next 调用
    5. if(to.meta.verification){
    6. try {
    7. // 验证正确
    8. await askForPage()
    9. }catch(error) {
    10. // 验证错误,取消导航
    11. return false
    12. }
    13. }
    14. }

    3.全局后置钩子

    全局后置钩子使用【router.afterEach】注册,它在导航被确认之后调用。

     参数:to 表示即将前往页面对应的路由对象,系统自动注入// from 表示即将离开页面的路由对象,系统自动注入

    1. const router = new VueRouter({....});
    2. router.afterEach((to,from)=>{
    3. //这里执行具体操作
    4. })

    4.路由守卫

    路由独享守卫是在routes配置的路由对象中直接定义的beforeEnter守卫。
    路由独享守卫只在进入路由时触发,参数改变时不会触发,它们只有在从一个不同的路由导航时,才会被触发

    1. const router = new VueRouter({
    2. routes: [
    3. {
    4. path: '/foo',
    5. component: Foo,
    6. beforeEnter: (to, from, next) => {
    7. // ...
    8. }
    9. }
    10. ]
    11. })

    5.组件内守卫

    共有三个组件内守卫:beforeRouteEnter、beforeRouterUpdate和beforeRouteLeave。

    注意:

    beforeRouterEnter守卫不能访问this,因为在守卫是在导航确认前被调用,这时新进入的组件实例还没有被创建。

    不过beforeRouteEnter有一个特权,就是它的next函数支持回调,而其他的守卫则不行。可以把组件实例作为回调方式的参数,在导航被确认后执行回调,而这个时候,组件实例已经创建完成。利用这个特性,可以将created钩子用beforeRoute守卫来替换

    1. //
    2. const book = {
    3. template:"...",
    4. beforeRouteEnter (to, from, next) {
    5. //在渲染该组件的路由被确认之前调用
    6. //不能通过this来访问组件实例,因为在守卫执行前,组件实例还没有被创建
    7. },
    8. beforeRouteUpdate (to, from, next) {
    9. //在渲染该组件的路由改变,但是该组件被复用时调用
    10. //例如,对于一个带有动态参数的路由 /foo/:id,在/foo/1和/foo/2之间跳转的时候
    11. //相同的foo组件实例将会被复用,而这个守卫就会在这种情况下被调用。
    12. //可以访问组件实例的this
    13. },
    14. beforeRouteLeave (to, from, next) {
    15. //导航即将离开该组件的路由时调用
    16. //可以访问组件实例的this
    17. }
    18. }

    5.路由元信息

    将任意信息附加到路由上,如过渡名称,谁可以访问路由等

    1. const routes = [
    2. ...
    3. meta:{
    4. //任何人都可以阅读文章
    5. requiresAuth:false
    6. }
    7. ]

    6.数据获取

    进入某个路由后,需要从服务器获取数据,我们可以通过两种方式来实现:

    • 导航完成之后获取:先完成导航,然后在接下来的组件生命周期钩子中获取数据。在数据获取期间显示“加载中”之类的指示。

           当你使用这种方式时,我们会马上导航和渲染组件,然后在组件的 created 钩子中获取数据。这让我们有机会在数据获取期间展示一个 loading 状态,还可以在不同视图间展示不同的 loading 状态。假设我们有一个 Post 组件,需要基于 $route.params.id 获取文章数据

    1. <template>
    2. <div class="post">
    3. <div v-if="loading" class="loading">Loading...div>
    4. <div v-if="error" class="error">{{ error }}div>
    5. <div v-if="post" class="content">
    6. <h2>{{ post.title }}h2>
    7. <p>{{ post.body }}p>
    8. div>
    9. div>
    10. template>
    1. export default {
    2. data() {
    3. return {
    4. loading: false,
    5. post: null,
    6. error: null,
    7. }
    8. },
    9. created() {
    10. // watch 路由的参数,以便再次获取数据
    11. this.$watch(
    12. () => this.$route.params,
    13. () => {
    14. this.fetchData()
    15. },
    16. // 组件创建完后获取数据,
    17. // 此时 data 已经被 observed 了
    18. { immediate: true }
    19. )
    20. },
    21. methods: {
    22. fetchData() {
    23. this.error = this.post = null
    24. this.loading = true
    25. // replace `getPost` with your data fetching util / API wrapper
    26. getPost(this.$route.params.id, (err, post) => {
    27. this.loading = false
    28. if (err) {
    29. this.error = err.toString()
    30. } else {
    31. this.post = post
    32. }
    33. })
    34. },
    35. },
    36. }
    • 导航完成之前获取:导航完成前,在路由进入的守卫中获取数据,在数据获取成功后执行导航。

          通过这种方式,我们在导航转入新的路由前获取数据。我们可以在接下来的组件的 beforeRouteEnter 守卫中获取数据,当数据获取成功后只调用 next 方法:

    1. export default {
    2. data() {
    3. return {
    4. post: null,
    5. error: null,
    6. }
    7. },
    8. beforeRouteEnter(to, from, next) {
    9. getPost(to.params.id, (err, post) => {
    10. next(vm => vm.setData(err, post))
    11. })
    12. },
    13. // 路由改变前,组件就已经渲染完了
    14. // 逻辑稍稍不同
    15. async beforeRouteUpdate(to, from) {
    16. this.post = null
    17. try {
    18. this.post = await getPost(to.params.id)
    19. } catch (error) {
    20. this.error = error.toString()
    21. }
    22. },
    23. }

  • 相关阅读:
    delphi 3层源码
    【NLP】多语言预训练模型(mBERT和XLM)
    洛谷 P1449 后缀表达式
    猿创征文 |【游戏开发实战——2D项目1 - Ruby‘s Adventure】控制游戏角色移动(1-2)
    在前端使用正则对输入form表单的数据进行格式判断
    GenICam标准(三)
    Set与二分法效率
    Notion 出现白屏的处理
    华为云HECS云服务器docker环境下安装nacos
    第二十三章 javascript请求方式Ajax
  • 原文地址:https://blog.csdn.net/JIAY_WX/article/details/126158304