Vue.js路由管理器 Vue Router

起步

  • HTML
<script src="https://unpkg.com/vue/dist/vue.js"></script>
<script src="https://unpkg.com/vue-router/dist/vue-router.js"></script>

<div id="app">
  <h1>Hello App!</h1>
  <p>
    <!-- 运用 router-link 组件来导航. -->
    <!-- 经由过程传入 `to` 属性指定链接. -->
    <!-- <router-link> 默许会被衬着成一个 `<a>` 标签 -->
    <router-link to="/foo">Go to Foo</router-link>
    <router-link to="/bar">Go to Bar</router-link>
  </p>
  <!-- 路由出口 -->
  <!-- 路由婚配到的组件将衬着在这里 n内置组件-->
  <router-view></router-view>
</div>
  • JavaScript
// 0. 假如运用模块化机制编程,导入Vue和VueRouter,要挪用 Vue.use(VueRouter)

// 1. 定义 (路由) 组件。
// 能够从其他文件 import 进来
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }

// 2. 定义路由
// 每一个路由应当映照一个组件。 个中"component" 能够是
// 经由过程 Vue.extend() 建立的组件组织器,
// 或许,只是一个组件设置对象。
// 我们晚点再议论嵌套路由。
const routes = [
  { path: '/foo', component: Foo },
  { path: '/bar', component: Bar }
]

// 3. 建立 router 实例,然后传 `routes` 设置
// 你还能够传别的设置参数, 不过先这么简朴着吧。
const router = new VueRouter({
  routes // (缩写) 相当于 routes: routes
})

// 4. 建立和挂载根实例。
// 记得要经由过程 router 设置参数注入路由,
// 从而让全部运用都有路由功用
const app = new Vue({
  router
}).$mount('#app')

// 如今,运用已启动了!

经由过程注入路由器,我们能够在任何组件内经由过程 this.$router 接见路由器,也能够经由过程 this.$route 接见当前路由:

export default {
  computed: {
    username () {
      // 我们很快就会看到 `params` 是什么
      return this.$route.params.username
    }
  },
  methods: {
    goBack () {
      window.history.length > 1
        ? this.$router.go(-1)
        : this.$router.push('/')
    }
  }
}

routes 选项 (Array)

redirect(重定向 )

//此时接见/a会跳转到/b
const router = new VueRouter({
  routes: [
    { path: '/a', redirect: '/b' }
  ]
})
//重定向的目的也能够是一个定名的路由:
const router = new VueRouter({
  routes: [
    { path: '/a', redirect: { name: 'foo' }}
  ]
})
//以至是一个要领,动态返回重定向目的:
const router = new VueRouter({
  routes: [
    { path: '/a', redirect: to => {
      // 要领吸收 目的路由 作为参数
      // return 重定向的 字符串途径/途径对象
    }}
  ]
})

定名路由

export default [
    {
        path:'/',
        redirect:'/app' //默许跳转路由
    },
    {
        path: '/app',
        //路由定名,可用于跳转
        name: 'app',
    }
]

//可用于跳转
<router-link :to="{name:'app'}">app</router-link>

路由元信息

定义路由的时刻能够设置 meta 字段:

export default [
    {
        path:'/',
        redirect:'/app' //默许跳转路由
    },
    {
        path: '/app',
        //**相当于HTML的meta标签**
        meta: {
            title: 'this is app',
            description: 'asdasd'
        },
    }
]

嵌套路由

export default [
    {
        path:'/',
        redirect:'/app' //默许跳转路由
    },
    {
        path: '/app',
        //子路由 婚配 /app/test
         children: [
           {
             path: 'test',
             component: Login
           }
         ]
    }
]

路由组件传参

export default [
    {
        path:'/',
        redirect:'/app' //默许跳转路由
    },
    {
        path: '/app/:id', // /app/xxx ,组件内部能够经由过程$route.params.id拿到这个值
        // 会把:背面的参数经由过程props传递给组件Todozhong 中
        //布尔形式
        props: true,
        //对象形式
        props:{id:456}
        //函数形式
        props: (route) => ({ id: route.query.b }),
        component: Todo,

    }
]

mode选项(string)

vue-router 默许 hash 形式 —— 运用 URL 的 hash 来模仿一个完整的 URL,因而当 URL 转变时,页面不会从新加载。

假如不想要很丑的 hash,我们能够用路由的 history 形式,这类形式充分利用 history.pushState API 来完成 URL 跳转而无须从新加载页面。

const router = new VueRouter({
  mode: 'history',
  routes: [...]
})

这类形式要玩好,还须要背景设置支撑。

base(string)

运用的基途径。比方,假如全部单页运用服务在 /app/ 下,然后 base 就应当设为 “/app/”

return new Router({
    routes,
    mode: 'history',//默许运用hash#
    base: '/base/', //在path前面都邑加上/base/,基途径
  })

linkActiveClass(string)

默许值: “router-link-active”

全局设置 <router-link> 的默许“激活 class 类名”。

return new Router({
    routes,
    mode: 'history',//默许运用hash#
    base: '/base/', //在path前面都邑加上/base/,基途径
    // 点击calss名字
    linkActiveClass: 'active-link', //婚配到个中一个子集
    linkExactActiveClass: 'exact-active-link',//完整婚配
  })

linkExactActiveClass(string)

默许值: “router-link-exact-active”

全局设置 <router-link> 准确激活的默许的 class。

scrollBehavior(Function)

路由跳转后是不是转动

export default () => {
  return new Router({
    routes,
    mode: 'history',//默许运用hash#
    base: '/base/', //在path前面都邑加上/base/,基途径
    //页面跳转是不是须要转动
    /*
        to:去处路由,完整路由对象
        from:泉源路由
        savedPosition:保留的转动位置
    */
    scrollBehavior (to, from, savedPosition) {
      if (savedPosition) {
        return savedPosition
      } else {
        return { x: 0, y: 0 }
      }
    },
  })
}

parseQuery / stringifyQuery (Function)

/每次import都邑建立一个router,防止每次都是同一个router
export default () => {
  return new Router({
    routes,
    mode: 'history',//默许运用hash#
    base: '/base/', //在path前面都邑加上/base/,基途径
    // 路由背面的参数?a=2&b=3,string->object
     parseQuery (query) {

     },
      //object->string
    stringifyQuery (obj) {

     }
  })
}

fallback(boolean)

当浏览器不支撑 history.pushState 掌握路由是不是应当回退到 hash 形式。默许值为 true。
假如设置为false,则跳转后革新页面,相当于多页运用

<router-link>

过渡动效

<router-view> 是基础的动态组件,所以我们能够用 <transition> 组件给它增加一些过渡结果:

<transition>
  <router-view></router-view>
</transition>

高等用法

定名视图

<router-view class="view one"></router-view>
<router-view class="view two" name="a"></router-view>
<router-view class="view three" name="b"></router-view>

const router = new VueRouter({
  routes: [
    {
      path: '/',
      components: {
      //默许组件
        default: Foo,
        //定名组件
        a: Bar,
        b: Baz
      }
    }
  ]
})

导航守御

  • 全局守御
import Vue from 'vue'
import VueRouter from 'vue-router'

import App from './app.vue'

import './assets/styles/global.styl'
// const root = document.createElement('div')
// document.body.appendChild(root)
import createRouter from './config/router'
Vue.use(VueRouter)

const router = createRouter()

// 全局导航守御(钩子)

// 考证一些用户是不是登录
router.beforeEach((to, from, next) => {
    console.log('before each invoked')
    next()
//   if (to.fullPath === '/app') {
//     next({ path: '/login' })
//     console.log('to.fullPath :'+to.fullPath )

//   } else {
//     next()
//   }
})

router.beforeResolve((to, from, next) => {
    console.log('before resolve invoked')
    next()
})

// 每次跳转后触发
router.afterEach((to, from) => {
    console.log('after each invoked')
})

new Vue({
    router,
    render: (h) => h(App)
}).$mount("#root")
  • 路由独享的守御

能够在路由设置上直接定义 beforeEnter 守御:

export default [
    {
        path:'/',
        redirect:'/app' //默许跳转路由
    },
    {
  
        path: '/app',
        // 路由独享的守御钩子
        beforeEnter(to, from, next) {
            console.log('app route before enter')
            next()
        }
        component: Todo,
    }
]
  • 组件内的守御
export default {
  //进来之前
  beforeRouteEnter(to, from, next) {
    // 不!能!猎取组件实例 `this`
    // 由于当守御实行前,组件实例还没被建立
    console.log("todo before enter", this); //todo before enter undefined
    //能够经由过程传一个回调给 next来接见组件实例。在导航被确认的时刻实行回调,而且把组件实例作为回调要领的参数。
    next(vm => {
        // 经由过程 `vm` 接见组件实例
      console.log("after enter vm.id is ", vm.id);
    });
  },
  //更新的时刻
  beforeRouteUpdate(to, from, next) {
    console.log("todo update enter");
    next();
  },
  // 路由脱离
  beforeRouteLeave(to, from, next) {
    console.log("todo leave enter");
    const answer = window.confirm('Do you really want to leave? you have unsaved changes!')
      if (answer) {
        next()
      } else {
        //以经由过程 next(false) 来作废。
        next(false)
      }
  },
  props:['id'],
  components: {
    Item,
    Tabs
  },
  mounted() {
    console.log(this.id)
  },
};

路由懒加载

参考:路由懒加载

    原文作者:sevencui
    原文地址: https://segmentfault.com/a/1190000015976735
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞