Vue-Router笔记

vue2.x版本中组件路由通过<router-link>标签配置,默认其将会被解析为一个<a>标签,当然你也可以使用tag属性将其渲染为其他的标签;进行了路由配置的组件可以通过<router-view>在HTML中整体渲染;当前router-link对应的路由处于激活状态时,自动被设置值为.router-link-active的class属性;<router-view>可以结合<keep-alive>标签一块使用

路由配置过程

// 路由配置
// 定义路由组件
const Foo = {template: '<div>foo</div>'}
const Bar = {template: '<div>foo</div>'}
// 为组件配置路由
const routes = [
  {path: '/foo', component: Foo},
  {path: '/bar', component: Bar}
]
// 创建router实例
const router = new VueRouter({
  routes
})
// 创建和挂载根实例
const app = new app({
  router
}).$mount('#app')

动态路由

使用模式匹配将匹配到的所有路由都映射到同一个组件,是多对一的关系;动态路径参数使用:进行标示,可以同时使用多个动态路径参数,并通过this.$route.params.paramName进行访问;

模式匹配路径$route.params
/user/:username/user/James
/user/Jordan
{username: ‘James’}
{username: ‘Jordan’}
/user/:username/NBA/:id/user/Kobe/NBA/24{username: ‘Kobe’, id:24}



路由信息对象(route object)记录当前已激活路由的状态信息,并且包含了当前url解析的相关信息;route object是一个不可变对象,因此每次成功进行到新的URL后会重新创建对应的route object对象;

route object除了route.$params属性外,还有这些属性:
1、$route.path:String类型,对应当前的绝对路径;
2、$route.hash:String类型,当前路由的hash值(带#);
3、$route.query:Object类型,键值对格式,URL的查询参数;
4、$route.fullPath:String类型,包含hash和query的完整URL路径;
5、$route.matched:数组类型,当前路由在内的所有嵌套路由记录(路由记录:routes对象数组中的每个成员都是一个路由记录);
6、$route.name:String类型,当前路由名称;

动态路由结合<transition :name=transitionName>组件可以实现根据动态路由实现不同的过渡效果;实例可以查看此处

// HTML
<transition :name="transitionName">
    <router-view></router-view>
</transition>

// JS
watch: {
    '$route' (to, from) {
        const toDepth = to.path.split('/').length;
        const fromDepth = from.path.split('/').length;
        this.transitionName = toDepth < fromDepth ? 'scroll-left' : 'scroll-right';
    }
}

嵌套路由

嵌套路由需要在父组件的模板中加入<router-view>作为子组件的渲染出口,并在routes中使用children定义子组件中路由的映射;以下是来自Vue.js官网的示例;

const User = {
  template: `
    <div class="user">
      <h2>User {{ $route.params.id }}</h2>
      <router-view></router-view>
    </div>
  `
}

const UserHome = { template: '<div>Home</div>' }
const UserProfile = { template: '<div>Profile</div>' }
const UserPosts = { template: '<div>Posts</div>' }
const router = new VueRouter({
    routes: [
      { path: '/user/:id', component: User,
        children: [
          // UserHome will be rendered inside User's <router-view>
          // when /user/:id is matched
          { path: '', component: UserHome },

          // UserProfile will be rendered inside User's <router-view>
          // when /user/:id/profile is matched
          { path: 'profile', component: UserProfile },

          // UserPosts will be rendered inside User's <router-view>
          // when /user/:id/posts is matched
          { path: 'posts', component: UserPosts }
        ]
      }
    ]
})

上例中为/user/foo通过''进行映射,否则/user/foo无法匹配到任何路由;


编程式导航

vue有三种路由模式,分别是history(基于HTML5 history API)、hash(默认, url hash,所有浏览器支持)和abstract(支持所有JavaScript运行环境);其中history路由模式是模仿window.history API得到的,对应有route.push(location)、route.replace(location)、route.go(n)方法进行导航;route.push()和route.replace()方法可以接受的参数类型包括字符串及多种不同类型的路由:

route.push('home');
route.push({path: 'home'});
route.push({path: 'home', name: 'google'});
route.push({params: {uid: 123});
route.push({path: 'register', query: {username: 'Kobe'});

命名路由和命名视图

命名路由可以前边已经提到,就是在创建VueRouter实例时,为path路径添加一个name属性,然后就可以直接使用包含name属性的对象传递给<router-ling>的to属性(路由信息对象),而不用直接使用相应的URL,这样后期修改的时候只需要修改VueRouter实例中;

为了在同一页面中不使用组件嵌套同时展示多个视图,可以使用命名视图,相应的关键字为components;需要注意其与嵌套路由的区别;

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

重定向和别名

重定向使用redirect关键字,而别名则可以跳出嵌套路由访问的限制,实例可以查看[我的JSFiddle示例]

const router = new VueRouter({
  routes: [
    { path: '/a', redirect: '/b' }
  ]
})
// HTML

<div id="app">
  <router-link to="/abc">foo</router-link>
  <router-link to='/x'>bar</router-link>
  <router-l

// JS
const Foo = { template: '<div>foo</div>' }
const Bar = { template: '<div>bar</div>' }
const Baz = { template: '<div>baz</div>' }

const router = new VueRouter({
  //mode: 'history',
  routes: [
      { path: '/x',
      component: Bar,
      alias: '/xyz'
    },
    { path: '/',
      component: Foo,
      alias: '/abc'
    },
    { path: '/p',
      component: Baz,
      alias: '/opq'
    }
  ]
})

滚动行为

Vue-Router提供了自定义页面切换路由时控制页面的滚动方式;前提是需要设置mode为history,也就是说不支持HTML5 history API的浏览器是不支持该特性的;

关键词为scrollBehavior(to, from, savedPosition)方法;to和from都是路由对象,而savedPosition仅在popState事件被触发后(使用浏览器的back/forward导航按钮)才使能;返回值为包含x坐标和y坐标的对象或者表示某个锚点的选择器对象{selector: string};具体效果可以参考jsFiddle

const scrollBehavior = (to, from, savedPosition) {
    if (savedPosition) {    
    // check if history popstate navigatios are available
        return savedPosition;
    } else {
        const position = {};
        // check if hash is available
        if (to.hash) {
            position.selector = to.hash;
        }
        // check if any matched route config has meta that requires scrolling to top
        if (to.matched.some (m => m.meta.scrollTop)) {  // $router.matched
            position.x = 0;
            position.y = 0;
        }
        return position;
    }
}

路由的懒加载

在访问大型应用时,较较多的JS脚本加载时间明显影响网站加载的速度,结合Vue的异步组件和webpack的代码分割功能(分割模块,可以仅加载依赖模块)实现路由组件的懒加载,可以有效的提高网站打开速度,在后期需要时再加载其他模块;

具体内容可以查看官方文档


Router配置

router对象具有mode(路由模式)、base(基路径)、routes(路由组件映射)、linkActiveClass(可以修改默认激活路由的类属性名称)、scrollBehavior(滚动行为);具有参见官方文档


Router实例

属性:
1、router.app:Vue实例类型,配置了router的Vue根实例
2、router.mode:String类型,路由模式
3、router.currentRouter:Route类型,当前路由的路由信息对象;

方法:
1、router.go(n) 、router.back()、router.forward()
2、router.push(location, onComplete?, onAbort?)、router.replace(location, onComplete?, onAbort?)
3、router.addRoutes(routes) 动态添加新路由规律
4、router.onReady(callback) 第一次路由跳转完成时被调用
5、router.resolve() 解析目标位置


参考文献

1、Vue-Router官方文档

2、GitHub代码示例: https://github.com/vuejs/vue-router/blob/next/examples/scroll-behavior/app.js

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Neil-

你们的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值