npm intall vue-router --save
和
定义两个组件,最后希望实现同一页面中两个组件的自由跳转。
Content.vue
<template>
<h1>内容页h1>
template>
<script>
export default {
name: 'Content'
}
script>
<style scoped>
style>
Main.vue
<template>
<h1>主页h1>
template>
<script>
export default {
name: 'Main'
}
script>
<style scoped>
style>
文件内容包括:
import Vue from 'vue'
import VueRouter from 'vue-router' // 1
// 2
import Content from '../components/Content'
import Main from '../components/Main'
Vue.use(VueRouter)
export default new VueRouter({
// 3
routes:[
{
// 路由的路径
path:'/content',
// 路由名称(可以不添加)
name:'content',
// 跳转的组件
component:Content
},
{
// 路由的路径
path:'/main',
// 路由名称(可以不添加)
name:'main',
// 跳转的组件
component:Main
}
]
})
main.js,此文件为项目执行入口
import Vue from 'vue'
import App from './App'
import router from './router' // 引入路由配置文件
Vue.config.productionTip = false
new Vue({
el: '#app',
router, //配置路由
components: { App },
template: ' '
})
App.vue
其中router-link为路由链接标签,router-view为跳转组件显示标签。
<template>
<div id="app">
<h1>vue-router 使用h1>
<router-link to="/main">首页router-link>
<router-link to="/content">内容页router-link>
<router-view>router-view>
div>
template>
<script>
export default {
name: 'App'
}
script>
:该标签是一个vue-router中已经内置的组件,它会被渲染成一个
标签
:该标签会根据当前的路径,动态渲染出不同的组件
处于同一个等级< router-view>
挂载的组件,其他内容不会发生改变
渲染首页的内容< router-view>
渲染首页组件呢?
const routes = [
{
path: '/',
redirect: '/home'
}
]
const router = new VueRouter({
routes,
mode: 'history'
})
中,我们只是使用了一个属性:to,用于指定跳转的路径
还有一些其他的属性:
之后渲染成什么组件,比如下面代码会被渲染成一个button(默认是a标签)<router-link to='/home' tag='button'>
<router-link to='/home' replace>
对应的路由匹配成功时,会自动给当前元素设置一个router-link- active的class,设置active-class可以修改默认的名称
方式一:
<router-link to='/home' active-class="active">
.active {
color: red;
}
方式二:
const router = new VueRouter({
routes,
linkActiveClass: 'active'
})
两种方式:
this.$router.push('/home') // push方式(可返回)
this.$router.replace('/home') // replace方式(不可返回)
路由路径添加参数(abc)
routes:[
{
path:'/user/:abc',
component: User
}
]
路由
<router-link :to="'/user/' + userId" active-class="active">用户router-link>
data() {
return {
userId: 'zhangsan'
}
}
跳转组件,引入参数
<h2>{{ userId }}h2>
computed: {
userId() {
return this.$route.params.abc
}
}
<h2>{{ $route.params.abc }}h2>
const Home = () => import('../components/Home.vue')
标签router/index.js:
const Home = () => import('../components/Home.vue')
const Message = () => import('../components/message.vue')
const News = () => import('../components/news.vue')
const About = () => import('../components/About.vue')
const routes = [
{
path: '/home',
component: Home,
children:[
{
path: 'messgae',
component: Message
},
{
path: 'news',
component: News
}
]
}
]
Home.vue:
<router-link to="/home/message">消息router-link>
<router-link to="/home/news">新闻router-link>
<router-view><router-view>
发送参数:
<router-link :to="{path: '/profile', query:{name:'why', age: 18, height:1.88}}">
档案
router-link>
<router-view>router-view>
profileClick() {
this.$router.push({
path: '/profile',
query: {
name: 'why',
age: 18,
height:1.88
}
})
}
接收参数:
<h2>{{ $route.query.name }}h2>
<h2>{{ $route.query.age }}h2>
<h2>{{ $route.query.height }}h2>
$router为 VueRouter实例,想要导航到不同URL,则使用$router. push方法
$route为当前 router跳转对象里面可以获取name、path、query、params等
注:给Object添加新属性
// 给obj添加age属性
const obj = {
name: 'why'
}
Object.defineProperty(obj, 'age', 18)
meta定义标题:
// 设置路由配置
{
path: '/home',
component: Home,
meta: {
title: '主页'
}
},
{
path: '/create',
component: Create,
meta: {
title: '创作'
}
},
{
path: '/setting',
component: Setting,
meta: {
title: '设置'
}
}
导航守卫修改标题:
const router = new VueRouter({
routes,
mode: 'history' // 路由方式改成history模式
})
// 前置守卫(guard),路由跳转之前执行的函数
router.beforeEach((to, from, next) => {
// 从from跳转到to,to表示当前路由对象
document.title = to.matched[0].meta.title
// console.log(to)
next()
}
// 前置守卫(guard),路由跳转之前执行的函数
router.beforeEach((to, from, next) => {
// 从from跳转到to,to表示当前路由对象
document.title = to.matched[0].meta.title
// console.log(to)
next()
}
// 后置钩子(hook),路由跳转之后执行的函数
router.afterEach((to, from)=>{
// 从from跳转到to,to表示当前路由对象
})
路由独享守卫:
{
path: '/home',
component: Home,
beforeEnter: (to,from.next) => {
// 与全局前置守卫的方法参数一致
}
}
以Home.vue中为例:
created() {
console.log('created')
}
// 下面这两个函数,只有该组件被保持了状态使用了keep-alive时,才是有效的
activated() {
this.$router.push(this.path)
console.log('activated')
}
deactivated() {
console.log('deactivated')
}
// 首页中使用path属性记录离开时的路径,在beforeRouteLeave中记录
beforeRouteLeave(to, from, next) {
this.path = this.$route.path
next()
}
App.vue中:
<keep-alive>
<router-view />
keep-alive>
<keep-alive exclude="Profile,User">
<router-view />
keep-alive>