/**
* Vue-router 基本用法
* npm install --save vue-router
*/
1, Router实例对象
const
RouterInstance =
new
Router({
/**
* mode 不设置默认使用 hash
* 就是使用#来设置路径
* history 模式通过/来设置路径
* 如果URL匹配不到任何的静态资源,则应该返回同一个index,
* 这个页面就是你 app 依赖的页面
*/
mode:
'history',
routes:
Routers,
// 路由对象
linkActiveClass:
'active-link',
// 路由被激活
linkExactActiveClass:
'extract-active-link',
// 路由完全匹配
scrollBehavior(
to,
from,
savePostrion) {
// 页面路径跳转的时候滚动的行为
// to
if (
savePostrion) {
return
savePostrion;
}
else {
return {
x:
0,
y:
0 }
}
},
// 下面这几个属性基本用不到
//
fallback:
true, // 不支持history前端路由的时候。自动设置到hash 如果不需要可以设置成false
//
parseQuery(
qyery) {},
// 把接受的参数 转换成object
//
stringifyQuery(
obj) {}
// 把接受的参数 转换成string
})
2, 路由对象的配置
const
Routers = [{
path:
'/index/:id',
// 指定当前匹配的路径 // /index/xxx
name:
'index',
//
component:
Index,
// 映射的组件
children: [{ // 子组件
path:
'/one',
component:
One
}],
meta: {
// 保存路由的信息 通过this.$route
title:
'this is title',
description:
'关键字'
},
alias:
'/component/index',
// 别名 //作用是将UI与URL任意的结合
beforeEnter
: (
to,
from,
next)
=> { // 路由导航
// ...
console.
log(
'组件路由');
next();
},
/**
* props传递参数 通过props把参数传递到组件内部。
* 布尔模式
* props: { default: true, sidebar: false }
* 对象模式
* props: { newsletterPopup: false }
* 函数模式
* props: (route) => ({ query: route.query.q })
*/
props:
true,
},
// 重定向
/**
* redirect 可以是以下的值:
* 1,字符串
* '/b'
* 2,可以是一个命名视图
* {name:'one'}
* 3,可以是方法
* to => {
* // 方法接受 目标路由 作为参数
* return 重定向的字符或者路径对象
* }
*/
{
path:
'*',
// 指定当前匹配的路径,不存在重定向到首页
redirect:
'/index'
},
{
path:
'/one/:id',
// /index/xxx
name:
'one',
component:
One,
},
{
path:
'/two',
name:
'two',
component:
Two,
},
{
// 命名视图
path:
'/',
components: {
default:
Index,
one:
One,
two:
Two
}
}
];
3,导航守卫
先执行全局导航守卫,然后执行路由配置导航守卫,最后执行组件内部导航守卫。
// 全局导航守卫---全局前置守卫
RouterInstance.
beforeEach((
to,
from,
next)
=> {
console.
log(
'全局导航守卫---全局前置守卫');
next();
});
RouterInstance.
beforeResolve((
to,
from,
next)
=> {
console.
log(
'全局导航守卫---beforeResolve');
next();
});
RouterInstance.
afterEach((
to,
from)
=> {
console.
log(
'全局导航守卫---全局后置');
});
//路由配置导航守卫、
beforeEnter
: (
to,
from,
next)
=> {
// ...
console.
log(
'组件路由');
next();
},
、
// 组件内部导航
4, 命名视图
beforeRouteEnter(to, from, next) {
// ...
// 在渲染该组件的对应路由被confirm前调用
// 组件还没有被创建不能访问this
console.
log(
"组件内部导航守卫--beforeRouteEnter");
next();
},
beforeRouterUpdate() {
// ...
// 在当前路由改变,但组件被服用的时候调用 可以访问this // 组件更新 mounted函数不会执行。
console.
log(
"组件内部导航守卫--beforeRouterUpdate");
next();
},
beforeRouteLeave(
to,
from,
next) {
// ...
//导航离开该组建时,路由调用。可以方位this
console.
log(
"组件内部导航守卫--beforeRouteLeave");
next();
}
<
router-view
></
router-view
>
<
router-view
name=
"one"
></
router-view
>
<
router-view
name=
"two"
></
router-view
>
{
// 命名视图
path:
'/',
components: {
default:
Index,
one:
One,
two:
Two
}
}
5,router-link 示例
<
router-link
to=
"/index"
>to-index
</
router-link
>
<
router-link
to=
"/one/123"
>to-one
</
router-link
>
<!--
router-link 默认渲染出来是a标签
tag 指定渲染成什么标签
replace 不会留下history记录,
使用后导航后不能用后退键返回上一个页面
active-class
router-link 对应路由匹配成功时候。会自动添加active-class
-->
<
router-link
:to="{
name:
'one'}"
tag=
"button"
>to-one-name
</
router-link
>
<
router-link
to=
"/one"
tag=
"button"
>to-one-tag
</
router-link
>
<
router-link
to=
"/one/123"
replace
>to-one-replace
</
router-link
>
<
button
@click="
handlerRouter"
>通过js跳转路由
</
button
>
handlerRouter() {
/**
* replace 不会向history添加记录,而是替换当前的history
*/
// this.$router.replace("/one/123");
/**
* 类似于 window.history.go();
*/
// this.$router.go(-1);
/**
* 编程式导航
* push() 参数可以是字符串 可以是对象
* replace() 不会添加记录和push使用方法一样
* go() 参数是整数
*/
// this.$router.push("/index");
// this.$router.push({
// path: "/index"
// });
// this.$router.push({
// name: "index"
// });
this.
$router.
push({
name:
"one",
params: {
id:
666 }
});
}
$ router 是vue-router的实例对象。是Vue的全局对象
$ route 是一个路由组件的对象,每一个组件都有一个$route;主要包含name,path,params,query等属性