路由配置
下载
vue中要使用路由,需要依赖第三方模块 - vue-router
版本之间要有配合:
vue2 + vue-router@3
vue3 + vue-router@4
下载对应的版本:
配置
需要在src文件夹下新建一个文件夹,文件夹下新建index.js,在这个文件中配置路由。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45
| import Vue from 'vue'
import VueRouter from 'vue-router'
import IndexCom from '../views/IndexCom.vue' import ListCom from '../views/ListCom.vue' import MyCom from '../views/MyCom.vue'
Vue.use(VueRouter)
const routes = [ { path: '/index', component: IndexCom }, { path: '/list', component: ListCom }, { path: '/my', component: MyCom } ]
const router = new VueRouter({ routes, mode: 'hash' })
export default router
|
在根组件中使用路由对象,在main.js中:
1 2 3 4 5 6 7 8 9 10
| import router from '@/router'
new Vue({ router, render: h => h(App) }).$mount('#app')
|
此时,当我们切换路径就可以显示对应的组件了。
eslint对代码的限制
- 导入文件需要在最顶端
- 不允许超出一个的空行
- 缩进是2个空格
- 最后一项不允许加逗号
- 文件结尾必须有一个空行
- 组件名称必须是多个单词组合
- 注册的组件必须使用
- 无用的空行不被允许
- 每行代码结尾后不允许有空格
- 函数的小括号前后都要有空格
- 对象键值对之间的冒号后,必须有空格
- 每行结尾不用分号
- 对象的开头大括号后必须有空格,对象的结尾大括号前必须有空格
- 逗号后面必须加空格
main.js是入口文件,显示什么内容,都由main.js控制。
单文件组件,后缀是.vue
的文件,有3个内容:template
标签,script
标签,style
标签。
router-view内置组件,要显示的组件在这里占位。
vue文件在编辑器中无法像正常代码一样显示(灰白色),装vacode插件 - vetur
声明式导航
概念:就是像a标签一样点击跳转的导航方式
使用内置组件router-link
的to属性进行设置跳转地址。
1 2 3
| <router-link to="/index">首页</router-link> <router-link :to="'/list'">列表页</router-link> <router-link :to="{path: '/my'}">我的</router-link>
|
传递参数:
1
| <router-link :to="{path: '/my', query: {name: 'zhangsan'}}">我的</router-link>
|
上面都是使用路由的path属性进行跳转了,也可以使用路由的name属性进行跳转:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
| const routes = [ { path: '/index', component: IndexCom, name: 'index' }, { path: '/list', component: ListCom, name: 'list' }, { path: '/my', component: MyCom, name: 'my' } ]
|
利用name设置跳转地址:
1
| <router-link :to="{name: 'my'}">我的</router-link>
|
传递参数除了可以使用query外,还可以使用params,query表现在地址栏,params就不在地址栏:
1 2
| <router-link :to="{name: 'my', query: {age: 12}}">我的</router-link> <router-link :to="{name: 'my', params: {age: 12}}">我的</router-link>
|
默认情况下router-link被编译成a标签了,如果想让他编译成其他标签,可以设置tag属性:
1
| <router-link tag="p" :to="{path: '/my', query: {name: 'zhangsan'}}">我的</router-link>
|
页面中的router-link就会别编译成p标签。
接收声明式导航传参
query传递的参数,在页面中接收,使用:
在模板中:
用params传递参数,接收:
在模板中:
编程式导航
概念:在js中像location.href一样去跳转的导航方式
1 2 3 4 5 6 7 8
| this.$router.push('路径') this.$router.push({path:'路径'}) this.$router.push({path:'路径', query: {参数}}) this.$router.push({name:'路由名称', query: {参数}}) this.$router.push({name:'路由名称', params: {参数}})
this.$router.go() this.$router.back()
|
注意:不允许跳转到当前路径
可以加两行代码搞定错误:
1 2 3 4
| const originalPush = VueRouter.prototype.push VueRouter.prototype.push = function push (location) { return originalPush.call(this, location).catch((err) => err) }
|
放在router/index.js中。
子路由配置
在父组件中要显示子组件,就需要在父路由中配置子路由。在父路由中用children配置子路由。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
| const routes = [ { path: '/index', component: IndexCom, name: 'index' }, { path: '/list', component: ListCom, name: 'list', children: [ { path: '/catlist', component: CatList }, { path: 'goodslist', component: GoodsList } ] }, { path: '/my', component: MyCom, name: 'my' } ]
|
重定向路由
概念:当我们访问路径1的时候,希望显示路径2对应的组件,给路径1配置路由的时候,不配置component,配置redirect,让这个路径跳转到路径2就ok。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| { path: '/', redirect: '/index' }, { path: '/index', component: IndexCom, name: 'index' },
|
404路由
当用户访问了一个没有配置过的路径的时候,应该给用户显示比较友好的404页面,需要配置404路由。
404路由必须配置在所有路由的最后:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| const routes = [ { path: '/', redirect: '/index' }, { path: '/index', component: IndexCom, name: 'index' }, { path: '/list', component: ListCom, name: 'list', children: [ { path: '/catlist', component: CatList }, { path: 'goodslist', component: GoodsList } ] }, { path: '/my', component: MyCom, name: 'my' }, { path: '*', component: NotFound } ]
|
动态路由
指的是restful风格的路径,指定这个路径中必须加参数,或某个参数可选
1 2 3 4 5 6 7 8 9 10
| { path: '/news/:id', component: NewsDetail }, { path: '/news/:id?', component: NewsDetail },
|