目录
前端路由:对于单页面应用程序来说,主要通过URL中的hash(#号)来实现不同页面之间的切换,同时,hash有一个特点:HTTP请求中不会包含hash相关的内容;所以,单页面程序中的页面跳转主要用hash实现;
后端路由:对于普通的网站,所有的超链接都是URL地址,所有的URL地址都对应服务器上对应的资源
在单页面应用程序中,这种通过hash改变来切换页面的方式,称作前端路由(区别于后端路由)
基本使用
npm install vue-router@4
yarn add vue-router@4
在router文件中
- // 引入
- import Vue from 'vue'
- import Router from 'vue-router'
- import home from '../views/home/index' // 组件
-
-
- // 挂载
- Vue.use(Router)
- export default new Router({
- routes: [
- {
- path: '/index', // 路径
- name: 'index', // name属性
- component: home // 组件
- },
- {},{} // 路由
- ]
- })
通过调用 app.use(router)
,我们可以在任意组件中以 this.$router
的形式访问它,并且以 this.$route
的形式访问当前路由:
在main文件中 (只展示核心代码)
- // 引入router
- import router from './router'
-
- new Vue({
- router,
- render: h => h(App)
- }).$mount('#app')
主页面
- <div id="app">
- <div class="nav">
- <a href='xxxx'> // a 链接跳转
- <div @click="toHome">首页div> // 点击事件跳转
- <router-link to="/my"
- tag="div" // tag 决定了link渲染到页面中是什么标签,默认是 a
- >我的router-link>
- div>
- <router-view />
- div>
- template>
-
- <script>
-
- export default {
- name: 'App',
- methods: {
- toHome() {
- this.$router.push({ path: '/index' })
- }
- }
- }
- script>
现在我们项目进入时实在 \ 地址下 是空白的 app 页
一般进入项目时,第一个页面是首页,比如我们首页有一个轮播图, 使用重定向
- // routes中
- {
- path: '/', // 源地址
- redirect: '/index' // 目的地址
- }
使用默认的样式 直接设置router-link-active
自定义样式 配置 linkActiveClass:'自定义的类名'
- .router-link-active{
- background-color: crimson;
- color: #39a9ed;
- }
选中我的,(默认的样式只在link标签有效) ,但是默认的不需要给每个link再去定义类名
两个页面我的 和 首页 ,两种方式 标签内的,和方法js中的,参数也都有两种方式,直接写字符串地址。定义一个对象 对象中的 path 是我们跳转的 地址,其他: name(路由的名字,路由有名字的话可以通过名字跳转) , query(参数,展示在地址栏中) ,params(不展示的隐藏参数)
- <div id="app">
- <div class="nav">
- <div @click="toHome">首页div>
- <router-link to="/my?id=123456789"
- tag="div"
- >我的router-link>
- div>
- <router-view />
- div>
-
- <script>
-
- export default {
- name: 'App',
- methods: {
- toHome() {
- this.$router.push({ path: '/index' })
- }
- }
- }
- script>
获取参数时:
- created() {
- console.log(this.$route.query.id) // query 或者 params
- }
- {
- path: '/my',
- name: 'my',
- component: () => import('@/views/my/index'),
- children: [ // 子路由
- {
- path: 'info',
- name: 'info',
- component: () => import('@/views/my/info')
- },
- {
- path: 'msg',
- name: 'msg',
- component: () => import('@/views/my/msg')
- }
- ]
- }
通过children 嵌套的子路由,当我们使用 name 去跳转,或者 填写路由链 时,地址栏如下
我的 页 template 代码
信息跳转 path 需要写上正确的地址链,消息跳转使用的是 name 简单便捷
- <div>
- <h1>我的 <span>{{ $route.query.id }}span>h1>
- <div class="nav">
- <router-link :to="{ path:'/my/info',query:{ info:'一段信息' }}"
- tag="div"
- >信息router-link>
- <router-link :to="{ name:'msg',params:{ msg:'一段很详细的消息' }}"
- tag="div"
- >消息router-link>
- div>
- <router-view />
- div>
两个子路由 页面
- <div>
- <h2>信息h2>
- <h3>{{ $route.query.info }}h3>
- div>
-
- <template>
- <div>
- <h2>消息h2>
- <h3>{{ $route.params.msg }}h3>
- div>
- template>
点击我的
点击信息 或者 消息
可以看到路由地址和组件显示正确
如果我们是用 path 访问路由 ,并且不写 第一层的 my
- <router-link :to="{ path:'info',query:{ info:'一段信息' }}"
- tag="div"
- >信息router-link>
路径和参数有,但是组件不显示,其实就是路由地址错了,访问不到组件
其他的知识,比如,路由的模式,路由必传参数,命名视图,等等。可以去官网学习