VUE(七):vue-router

vue-router

6.1 相关理解

6.1.1 vue-router 的理解

vue 的一个插件库,专门用来实现 SPA 应用

6.1.2 对 SPA 应用的理解

1.单页 Web 应用(single page web application,SPA)。

2.整个应用只有一个完整的页面。

3.点击页面中的导航链接不会刷新页面,只会做页面的局部更新。

4.数据需要通过 ajax 请求获取。

6.1.3 路由的理解

1.什么是路由?

(1).一个路由就是一组映射关系(key - value)

(2).key 为路径, value 可能是 function 或 component

2.路由分类
后端路由:
  1. 理解:value 是 function, 用于处理客户端提交的请求。

  2. 工作过程:服务器接收到一个请求时, 根据请求路径找到匹配的函数 来处理请求, 返回响应数据。

前端路由:
  1. 理解:value 是 component,用于展示页面内容。

  2. 工作过程:当浏览器的路径改变时, 对应的组件就会显示。

6.2 基本路由

6.2.1.基本使用

Vue2安装vue-router,命令:npm i vue-router@3
Vue3安装vue-router,命令:npm i vue-router

1.编写路由配置项

src/router/index.js,该文件专门用于创建整个应用的路由器

//该文件专门用于创建整个应用的路由器
import VueRouter from "vue-router";

//引入组件
import About from '../component/About.vue'
import Home from '../component/Home.vue'

//创建并暴露一个路由器
export default new VueRouter({
    //路由:route, 路由器:router
    routes:[
        {
            path:'/about',
            component:About
        },
        {
            path:'/home',
            component:Home
        }
    ]
})
2.main.js引入配置项并使用插件
import Vue from 'vue'
import App from './App.vue'

//引用VueRouter
import VueRouter from 'vue-router'
//引入路由器
import router from './router/index'
//应用VueRouter
Vue.use(VueRouter)
Vue.config.productionTip=false

new Vue({
    el:'#app',
    render:h=>h(App),
    router:router
})
3.实现路由切换

使用``标签实现路由的切换 ,to=“/xxx”是展示的路径,

<router-link class="list-group-item" active-class="active" to="/about">About</router-link>
<router-link class="list-group-item" active-class="active" to="/home">Home</router-link>

4.指定展示的位置
<router-view></router-view>

6.2.2 几个注意点

(1).路由组件通常放在pages文件夹,一般组件放在components文件夹

(2).通过切换,“隐藏”了的路由组件,默认是被销毁掉的,需要的时候再去挂载

(3).每个组件都有自己的$route属性,里面存储着自己的路由信息

(4).整个应用只有一个router,可以通过组件的$router属性获取到

6.3 嵌套(多级)路由

1.配置路由规则,使用children配置项

routes:[
        {
            path:'/about',
            component:About
        },
        {
            path:'/home',
            component:Home,
            children:[
                {
                    path:'news',
                    component:News,
                },
                {
                    path:'messages',
                    component:Messages,
                }
            ]
        }
    ]

2.跳转(要写完整路径,把它老爹带上)

 <router-link to="/home/news">News</router-link>

6.4 路由传参

6.4.1 路由的query参数

1.传递参数

 <!-- 1.跳转路由并携带query参数,to的字符串写法 -->
 <router-link :to="`/home/messages/detail?id=${m.id}&title=${m.title}`">	{{m.title</router-link> 
          
 <!-- 2.跳转路由并携带query参数,to的对象写法 -->
     <router-link :to="{
        path:'/home/messages/detail',
        query:{
           id:m.id,
           title:m.title
        	}
    	}">
         {{m.title}}
	</router-link>

2.接收参数

$route.query.id
$route.query.title

6.4.2 简化路由

1.作用:可以简化路由的跳转

2.如何使用

​ 1.给路由命名

{
    path:'/demo',
    component:Demo,
    children:[
         {
    		path:'test',
    		component:Test,
   			 children:[
       			{
         			name:'hello',//命名路由
          			path:'welcome',
          			component:Detail
         		}
            ]
  		}
    ]
}

​ 2.简化跳转

 <!-- 简化前:需要写完整的路径 -->
<router-link :to="/demo/test/welcome">跳转</router-link>

 <!-- 简化后:直接通过名字跳转 -->
<router-link :to="{name:'hello'}">跳转</router-link>

 <!-- 简化写法配合传递参数 -->
<router-link 
	:to="{
		name:'hello',
		query:{
			id:666,
			title:'你好'
		}
	}"
>跳转</router-link>

6.4.3 路由的params参数

1.配置路由,声明接收params参数

 {
            path:'/home',
            component:Home,
            children:[
                {
                    path:'news',
                    component:News,
                },
                {
                    path:'messages',
                    component:Messages,
                    children:[
                        {
                            name:'xiangqing',//命名路由
                            path:'detail/:id/:title', //使用占位符声明接收params参数
                            component:Detail
                        }
                    ]
                }
            ]
        }

2.传递参数

 <!-- 跳转路由并携带params参数,to的字符串写法 -->
 <router-link :to="`/home/messages/detail/${m.id}/${m.title}`">{{m.title}}</router-link>
          
 <!-- 跳转路由并携带params参数,to的对象写法 -->
 <router-link 
 	:to="{
           name:'xiangqing',
           params:{
           id:m.id,
           title:m.title
            }
          }"
  >{{m.title}}</router-link> -->

特别注意:路由携带params参数,若使用to的对象写法,则不能使用path配置项,必须使用name配置!

3.接收参数

$route.params.id
$route.params.title

6.4.4 路由的props配置

{
  name:'xiangqing',//命名路由
  // path:'detail/:id/:title',//用第二种方法时
  path:'detail',
  component:Detail,

  //props的第一种写法:值为对象,该对象中的所有key-value都会以props的形式传给Detail组件
  // props:{a:1,b:'hello'}

 //props的第二种写法,值为布尔值,若布尔值为真,就会把该路由组件收到的所有params参数,以props的形式传递给Detail组件
 // props:true

 // props的第三种写法,值为函数,该函数的返回对象中每一组key-value都会通过props传给Detail组件
    props($route){
        			return {
                              id:$route.query.id,
                              title:$route.query.title
                                }
                            }
                        }

6.4.5 <router-link>的replace属性

1.作用:控制路由跳转时操作浏览器历史记录的模式

2.浏览器的历史记录有两种写入方式:分别为pushreplace,push是追加历史记录,replace是替换当前记录。路由跳转时默认为push

3.如何开启replace模式:<router-link replace ..........>News</router-link>

6.5 编程式路由导航

1.作用:不借助<router-link>实现路由跳转,让路由跳转更加灵活

2.具体编码

pushShow(m){
        this.$router.push({
          name:'xiangqing',
            query:{
              id:m.id,
              title:m.title
            }
        })
    },
      replaceShow(m){
        this.$router.replace({
          name:'xiangqing',
            query:{
              id:m.id,
              title:m.title
            }
        })
      }

this.$router.back()//后退
this.$router.forward()//前进
this.$router.go(-2)//后退两步
this.$router.go(2)

6.6 缓存路由组件

1.作用:让不展示的路由组件保持挂载,不被销毁

2.具体编码:

//单个
<keep-alive include="News">
     <router-view></router-view>
  </keep-alive>
//多个
<keep-alive :include="['News','Messages']">
     <router-view></router-view>
</keep-alive>

6.7 俩个新的生命周期钩子

1.作用;路由组件所独有的两个钩子,用于捕获路由组件的激活状态

2.具体名字

(1).activated路由组件被激活时触发

(2).deactivated路由组件失活时触发

6.8 路由守卫

1.作用:对路由进行权限控制

2.分类:全局守卫、独享路由、组件内路由

3.全局守卫

//全局前置路由守卫————初始化时被调用、每次路由切换之前被调用
router.beforeEach((to,from,next)=>{
    console.log('beforeEach',to,from);
    if(to.meta.isAuth){ //判断是否需要鉴权
       if(localStorage.getItem('school')==='ydgl'){
            next() //放行
       }else{
        alert('无权限无法查看!')
       }
    }else{
        next()
    }
})

//全局后置路由守卫————初始化时被调用、每次路由切换之后被调用
router.afterEach((to,from)=>{
    console.log('afterEach',to,from);
    if(to.meta.title){
        document.title = to.meta.title//修改网页的title
    }else{
        document.title = 'vue_test'
    }
    
})

4.独享路由守卫

beforeEnter:(to,from,next)=>{
             .........         
       }

5.组件内守卫

//通过路由规则,进入该组件时被调用
    beforeRouteEnter: (to, from, next) => { 
    },
    //通过路由规则,离开该组件时被调用
  beforeRouteLeave (to, from, next) {
  }

6.9 路由器的两种工作模式

1.对于一个url来说,什么是hash值?—— #及其后面的内容就是hash值

2.hash值不会包含在 HTTP 请求中,即:hash值不会带给服务器。

3.hash模式(默认):
(1).地址中永远带着#号,不美观 。
(2).若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法。
(3).兼容性较好。

4.history模式

(1).地址干净,美观 。
(2).兼容性和hash模式相比略差。
(3).应用部署上线时需要后端人员支持,解决刷新页面服务端404的问题。 (可以安装 connect-history-api-fallback )

const router =  new VueRouter({
    mode:'hash',
    ..........
    })
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值