• SPA应用——Vue Router


    Vue Router

    当今,SPA应用相比较传统项目使用的MPA应用页面结构,可以更好的提供给用户舒适的体验,而 Vue Router 是Vue.js官方提供的一种路由管理器,让构建单页面应用变得易如反掌,下面,来介绍一下初步使用的一些注意的点

    一、安装与配置vue-router

    yarn add vue-router

    1. 一般我们vue项目开发是在vue-cli脚手架中进行的,所以下面的使用介绍也是应用在脚手架中进行讲解

    首先我们要在配置文件中引入我们的Vue Router,并且通过Vue.use()来注册完成注册路由

    // 引入router
    import Vue from 'vue'
    import Router from 'vue-router'
    
    // 通过Vue.use方法来注册插件
    Vue.use(Router)
    
    1. 引入完成后,我们开始创建vue路由
    // 创建Router路由器实例对象
    const router = new Router({
      routes
    })
    

    我们可以在routes中定义我们所需要进行的路由配置,由于vue内部在进行webpack打包的时候,往往会把所有的js文件和成一个app.js,会造成进入页面的时候,即便是加入了login...,也严重影响了用户的体验,所以在这里我们可以利用路由的懒加载,将页面js文件再进行划分,需要的时候在加载页面用到的js文件,可以有效的分担首页所承担的加载压力,减少首页加载用时。

    const routes = [
      {
        // url地址栏的路径
        path: '/films',
        // 根据url地址栏的路径映射的视图路由组件,并且进行懒加载,异步组件处理
        component: () => import '@/views/Films',
        //如果我们要进行二级路由的话,只需要在一级路由中写入一个children属性
        children: [
        	{
            name: 'now',
            path: '/films/nowplaying',
            component: () => import('@/views/films/Nowplaying')
          },
          {
            name: 'ing',
            path: 'comingsoon',
            component: () => import('@/views/films/ComingSoon')
          }
        ]
      },
     //在这里也可以进行默认路由的配置
     {
    		path: '',
        component: () => import('@/views/Films')
     },
       // 默认路由
      {
        path: '/',
        // 默认改写到
        redirect: '/films'
      },
      // 以上路由都没有匹配上的话进入通配路由
      {
        path: '*',
        redirect: '/films'
      }
    ]
    
    1. 进行完路由配置后,我们还需要在根实例(main.js)上注入router,是为了让所有的组件都能通过this来拿到$route和$router身上自带的一些相关功能api
    // 引入router实例
    import router from './router'
    new Vue({
      render: h => h(App),
      // 目的:让我们的组件上面可以访问到路由相关的api($route和$router)
      router
    }).$mount('#app')
    
    1. 我们在index.js文件中配置了路由后,可以通过yarn serve的方式来开启服务器,得到我们的前端页面,此时我们会发现,页面上并没有配置好的组件结构,那是因为我们还缺少一个进行路由跳转的接收标签——router-view

    我们可以通过在我们要插入配置的路由组件的地方,写入一个router-view标签来接收内容,此时页面上便会显示出配置好的组件结构

    1. 这时,我们就可以通过在页面地址栏输入/+我们自己配置的路由path来进行页面跳转了,我们就可以通过声明导航的方式来实现路由的跳转,就不需要在地址栏输入来进行测试了
    //假如我们在Tabber组件里有一组数据
    data() {
    //这里存放数据
    return {
      navList: [
        { id: 1, title: '电影', path: '/films' },
        { id: 2, title: '影院', path: '/cinema' },
        { id: 3, title: '个人中心', path: '/center' }
      ]
    }
    
    <!--这时就可以通过声明导航来实现路由跳转-->
    <router-link v-for='nav in navList'
      tag='li'
      :to='nav.path'
      :key='nav.id'
      active-class='active'
    >{{nav.title}}
    </router-link>
    

    在这里,我们Vue Router完成SPA应用的基本模式就已经结束了

    二、开发实际问题

    1. 有时候,我们需要在路由跳转的时候上传参数,路由传参的方式主要有两种:路由参数和queryString参数
    • 路由参数主要是通过动态id的方式在路由表中进行设置
    {path:'/detail/:id',component:Detail}
    

    在该组件中,就可以利用我们在安装Vue Router时给根实例注入router,每个组件拿到的$route来拿到传过来的id

    通过this.$route.params来使用

    • queryString参数主要是通过直接设置?,?后面的内容会被this.$route.query来拿到

    • 利用prop可以将路由与组件解耦

      我们在通过动态id来获取id时,往往会感觉this.$route.params来拿id过于冗余

      可以在路由配置表中设置一个props: true

    {path:'detail/:id',component:AppNewsDetail,name:'detail',props:true}
    

    在路由中就可以通过props接收id,直接可以调用了props : ['id']

    1. 路由模式

    路由有两种模式——hash模式和history模式,默认会使用hash模式,如果我们想使用history模式的话,我们只需在创建Router实例对象时设置mode: 'history'就可以了

    //创建Router的实例对象
    const router = new Router({
        mode:"hash",
        routes
    })
    
    • hash模式的原理是hash改变会触发hashchange事件

      • 兼容性好,iE8,地址栏有#,看起来不太舒服
    • history模式本质使用H5的histroy.pushState方法来更改url

      • 兼容性不好,iE10,地址栏去掉了#,但是对后端有要求,否则会出现404的局面,就不太好了

      总的来说,如果有去掉#号的需求的话,那必须是使用history了。

    1. 路由守卫

    在某些情况,当路由跳转前和跳转后,我们需要进行一些相应的操作,这时,我们就可以使用路由提供的一些钩子函数来监听路由的变化了

    • 全局路由

      在路由表中设置

      //全局的前置路由守卫  路由跳转之前就会执行
      //from 当前导航正要离开的路由对象
      //to 即将要进入的目标路由对象
      router.beforeEach((to,from,next)=>{
          if(from.path === "/cinema"){
              console.log("从影院这边过来的哦...")
          }
          next()  //必须要加next  
      })
      
      //全局的后置路由守卫  路由跳转之后
      router.afterEach((to,from)=>{
          if(to.path === "/center"){
              console.log("进入center了哦...")
          }
      })
      
    • 单个路由钩子,在进入前执行,to参数就是当前路由

        {
            path:"/center",
            component:()=>import(/*webpackChunkName:'center'*/"@/views/Center"),
            beforeEnter(to,from,next){
                console.log("进入到center之前....")
                next()
            }
        }
    
    • 路由组件钩子
      beforeRouteEnter (to, from, next) {
        // 在渲染该组件的对应路由被 confirm 前调用
        // 不!能!获取组件实例 `this`
        // 因为当守卫执行前,组件实例还没被创建
      },
      beforeRouteUpdate (to, from, next) {
        // 在当前路由改变,但是该组件被复用时调用    
        // 举例来说,对于一个带有动态参数的路径 /foo/:id,在 /foo/1 和 /foo/2 之间跳转的时候,
        // 由于会渲染同样的 Foo 组件,因此组件实例会被复用。而这个钩子就会在这个情况下被调用。
        // 可以访问组件实例 `this`
      },
      beforeRouteLeave (to, from, next) {
        // 导航离开该组件的对应路由时调用
        // 可以访问组件实例 `this`
      }
    

    以上,是使用vue-router在脚手架中进行SPA页面应用的一些常用操作,若有出入,欢迎指出,立马改正

  • 相关阅读:
    ST表学习笔记
    LCA学习笔记
    $ZOJ 2432 Greatest Common Increasing Subsequence$
    $SP15637 GNYR04H - Mr Youngs Picture Permutations$
    Noip2016换教室
    洛谷4718【模板】Pollard-Rho算法
    CQOI2016 密钥破解
    Poj3696 The Lukiest Number
    Noip2012同余方程
    同余
  • 原文地址:https://www.cnblogs.com/Huskie-/p/13526024.html
Copyright © 2020-2023  润新知