• Vue-Router


    2.1前端路由与后端路由区别

    • 后端路由:类似 jsp(java)/node.js 后端来判断跳转到哪个页面
    1. 前端每个页面都已经写好1.html 2.html 
    2. 后端按照逻辑进行重定向跳转
    • 前端路由:类似vue-router
    1. 同一个链接
      • 例如 localhost:8080
      • localhost:8080/home
      • localhost:8080/me

      会按照后面的 "/" "/home" "/me"进行解析,从而从打包好的js中获取需要的js/css等资源

    2. 脚手架会将所有的代码进行压缩打包到一个js中,按照不同的路径进行选择所对应的资源(js/css等)

    2.2 hash与history区别

    • hash实现【可回退/难看】
    1. 前端的路由和后端的路由在实现技术上不一样,但是原理都是一样的。在 HTML5 的 history API 出现之前,前端的路由都是通过 hash 来实现的,hash 能兼容低版本的浏览器。如果我们把上面例子中提到的 3 个页面用 hash 来实现的话,它的 URI 规则中需要带上 #。
    2. hash值的改变,都会在浏览器的访问历史中增加一个记录。因此我们能通过浏览器的回退、前进按钮控制hash的切换。
    1 http://10.0.0.1/
    2 http://10.0.0.1/#/about
    3 http://10.0.0.1/#/concat
    • history API实现
    1. 主要的两个API history.pushState()和history.repalceState()
      •   其中push可回退
      •        replace不可回退
    2. 相比hash更美观
    1 http://10.0.0.1/
    2 http://10.0.0.1/about
    3 http://10.0.0.1/concat

    2.3路由基本配置

    • 安装Vue-router
    1 npm install vue-router
    • 导入vue和router模块 并使用
    1 import Vue from 'vue'
    2 import VueRouter from 'vue-router'
    3 
    4 Vue.use(VueRouter)
    • 创建路由对象【新建router实例对象】
    • 懒加载:当打包构建应用时,JavaScript 包会变得非常大,影响页面加载。如果我们能把不同路由对应的组件分割成不同的代码块,然后当路由被访问的时候才加载对应组件,这样就更加高效了。
     1 //路由懒加载
     2 const Home = () => import('../views/home/Home.vue')
     3 const Category = () => import('../views/category/Category.vue')
     4 const Me = () => import('../views/me/Me.vue')
     5 
     6 
     7 //2.创建路由对象 
     8 const routes = [
     9     {
    10         path:'',
    11         redirect:'/home'
    12     },
    13     {
    14         path:'/home',
    15         component:Home
    16     },
    17     {
    18         path:'/me',
    19         component:Me
    20     },
    21     {
    22         path:'/category',
    23         component:Category
    24     }
    25     
    26 ]
    27 const router = new VueRouter({
    28     routes : routes,
    29     mode : 'history'
    30 })
    • 导出路由
    1 //导出路由
    2 export default router
    • 在需要使用路由的页面 使用router-view
      •  此处取app.vue文件作为示例 当加入<router-view></router-view>即代表前端路由生效
     1 <template>
     2     <div id="app">
     3         <router-view></router-view>
     4         <maintabbar></maintabbar>
     5     </div>
     6 </template>
     7 
     8 <script>
     9 
    10 import maintabbar from './components/tabbar/maintabbar.vue'
    11     export default {
    12         name: 'App',
    13         components: {
    14             maintabbar: maintabbar
    15         }
    16     }
    17 </script>
    18 <style>
    19     @import url("assets/css/base.css");
    20 </style>

    注意点:

    • 当操作默认路由时 即直接访问localhost:8080/ 应用 redirect重定向
    • 创建实例时mode:history即可使用history【上方有和hash区别】

    2.4动态路由(传参)

    • 可只传单参 /user/:id    接收单个参数
    • 也可传递多个参数  接收对象参数
    1 //修改路由配置
    2    {
    3      path: '/describe/:id',
    4      name: 'Describe',
    5      component: Describe
    6    }

     在目标路径下接收参数

    this.$route.params.id

     在目标路径下接受多个对象

    1 this.$route.query

     2.5嵌套路由

    • 路由配置修改【children关键词】
    const router = new VueRouter({
      routes: [
        { path: '/user/:id', component: User,
          children: [
            {
              // 当 /user/:id/profile 匹配成功,
              // UserProfile 会被渲染在 User 的 <router-view> 中
              path: 'profile',
              component: UserProfile
            },
            {
              // 当 /user/:id/posts 匹配成功
              // UserPosts 会被渲染在 User 的 <router-view> 中
              path: 'posts',
              component: UserPosts
            }
          ]
        }
      ]
    })

     2.6导航守卫

    • 全局首位
      •   全局前置守卫
        1 const router = new VueRouter({ ... })
        2 
        3 router.beforeEach((to, from, next) => {
        4    //。。
        5    next() 
        6 })
      •   全局后置守卫(无next)
        1 router.afterEach((to, from) => {
        2   // ...
        3 })
      • 每个守卫方法接收三个参数
        •     to: Route: 即将要进入的目标 路由对象

        •     from: Route: 当前导航正要离开的路由

        •     next: Function: 一定要调用该方法来 resolve 这个钩子。执行效果依赖 next 方法的调用参数。

          ***确保要调用 next 方法,否则钩子就不会被 resolved

    • 路由独享守卫【用法类似 声明在routes中】
       1 const router = new VueRouter({
       2   routes: [
       3     {
       4       path: '/foo',
       5       component: Foo,
       6       beforeEnter: (to, from, next) => {
       7         // ...
       8       }
       9     }
      10   ]
      11 })
    • 组件守卫【用法类似 声明在组件中】
       1 const Foo = {
       2   template: `...`,
       3   beforeRouteEnter (to, from, next) {
       4     // 在渲染该组件的对应路由被 confirm 前调用
       5     // 不!能!获取组件实例 `this`
       6     // 因为当守卫执行前,组件实例还没被创建
       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 }
  • 相关阅读:
    不错的前端特效
    查询世界城市维度、经度
    echarts 省市区县geoJson获取
    Echarts世界地图中国分区显示
    全国主要城市空气质量
    Echarts世界地图中国分区显示与获取具体城市的geojson
    md编辑器typora
    PHP基础之数组方法
    PHP封装 冒泡排序算法
    PHP基础之日期和时间管理
  • 原文地址:https://www.cnblogs.com/cc123nice/p/12570772.html
Copyright © 2020-2023  润新知