vue-router路由

component文件夹:经常放置非路由组件
pages|views文件夹:经常放置路由组件
项目中配置的路由一般放在router文件夹中

配置路由

/src/router/index.js中配置。

import Vue from 'vue';
import VueRouter from 'vue-router';
Vue.use(VueRouter)

export default new VueRouter({
  mode: history, // 默认 hash
  routes:[
  {
      name:'login',// 给路由命名  路由path过长时,跳转路由可以简化编码
      path:'/dashboard',// 路径
      component:Home,// 组件
      children: [// 子路由  嵌套路由
        name:'',
        path:'about/:id/:title', // params传参设置占位符
        component:Banner,
        props: {id: 2,title: '关于'},// 第一种写法:值为对象,该对象的所有key-value都会以props的形式传给组件
        props: true, // 第二种写法:值为布尔值,若为真,会把路由组件收到的params参数以props形式传递给组件
        props:($route){// 第三中写法:值为函数,函数返回的对象会把路由组件收到的参数以props形式传递给组件
          return {id: $route.query.id, title: $route.query.title};// 必须返回对象
        }, 
        props: ({query:{ id,title }}){// 第三种写法(简写):连续性解构赋值
          return { id,title };
        },
        meta: {// 存放自定义数据  用于路由守卫做权限校验
          title: '首页',
          authority: true,// 是否需要鉴权
        },
      ]
    }
  ]
 });

main.js中注册路由

路由组件与非路由组件的区别:
  1. 路由组件一般放置在pages|views文件夹,非路由组件一般放置在component文件夹中
  2. 路由组一般需要在router文件夹中进行注册,使用时用的就是组件的名字;非路由组件在使用时,一般是以标签的形式使用
  3. 注册完路由,不管是路由组件还是非路由组件身上都有$route$router属性
    $route:每个组件实例都有一个route属性,存储这自己的路由信息。一般获取路由信息【路径、query、params】
    $router: 整个应用只有一个$router属性,一般进行编程式导航进行路由跳转【push|replace】

切换路由后,上个路由组件默认被销毁,新的路由组件被挂载。
配置路由规则时,一级路由组件需要加/,子路由不需要加/,Vue自动会加上。

路由跳转

路由跳转的两种形式:声明式导航 router-link编程式导航 $router.push|replace
声明式导航能做的,编程时导航都能;但是编程式导航还可以做一些其他业务逻辑。
<router-link active-class="" to="/home"></router-link> router-link有active-classto属性。

路由传参

params参数:属于路径当中的一部分,需要注意,在配置的时候需要占位:id
query参数:不属于路径当中的一部分,不需要占位,类似ajax中的queryString /home?k=v

query参数
  • 传递参数
 <!-- 跳转并携带query参数,to的字符串模板写法 -->
    <router-link :to="`/dashboard/workplace?id=${id}`" >注册账户</router-link>
    <!-- 跳转并携带query参数,to的对象写法 -->
    <router-link :to="{path: `/dashboard/workplace`, query: {id: id}}" >注册账户</router-link>
    <router-link :to="{name: 'register',query: {id}}" >注册账户</router-link>// 命名路由跳转
  • 接收参数
    $route.query.id
    <div class="footer">
      {{ $route.query.id }}
    </div>
params参数
  • 传递参数
 <!-- 跳转并携带params参数,to的字符串模板写法 -->
    <router-link :to="`/dashboard/workplace/${id}/${title}`" >注册账户</router-link>
    <!-- 错误写法❌ 不可使用 path,只能使用name -->
    <router-link :to="{path: `/dashboard/workplace`, params: {id: id}}" >注册账户</router-link>
    <!-- 跳转并携带params参数,to的对象写法  ✅-->    
    <router-link :to="{name: 'register',params: {id}}" >注册账户</router-link>// 命名路由跳转
  • 接收参数
    $route.params.id
    <div class="footer">
      {{ $route.params.id }}
    </div>

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

props传参

路由传递参数以props的方式传递给组件,需要在路由配置规则中配置props项。

  1. 有三种配置方法
  • 第一种写法:值为对象,该对象的所有key-value都会以props的形式传给组件,这里只能传递固定的值。
    props: {id: 2,title: '关于'}
  • 第二种写法:值为布尔值,若为真,会把路由组件收到的params参数以props形式传递给组件
    props: true
  • 第三中写法:值为函数,函数返回的对象会把路由组件收到的query参数以props形式传递给组件
props:($route){
   return {id: $route.query.id, title: $route.query.title};// 必须返回对象
}, 
// 简写:连续性解构赋值
props: ({query:{ id,title }}){
   return { id,title };
}
  1. 组件获取props
    配置props,数组方式接收
    props: ['id', 'title']

注意

  • 对象写法可以是name、path形式,但是path不能结合params参数一起使用
  • 如果路由要求传递params参数,但是没有传递,URL会出现问题。要想不出现问题,需要在配置路由的时候,在占位参数后面加上?,该符号表示params可传可不传递
  • params传递是一个空字符串,需要使用undefined,才能保证URL正常
路由模式

路由历史记录模式有pushreplace,Vue默认的是push模式。push模式会保留历史记录,可以回退也可以前进。replace模式不会保留历史记录,会替换当前路由。
声明式导航使用replace模式需要在<router-link>标签添加replace属性。

<router-link :replace="true"  to="/login></router-link">
//简写
<router-link replace  to="/login></router-link>
编程式路由导航 $router

作用:不借助router-link实现理由跳转

this.router.push(
  {
    name: 'login',
    params: {},
  }
)
this.router.replace(
  {
    name: 'login',
    params: {},
  }
)

this.router.back():后退
this.router.forward():前进
this.router.go(-2): 前进或后退多少个路由

路由缓存 <keep-alive/>

组件不会被销毁

// 缓存单个组件  字符串形式
<keep-alive includes=“News”>
  <router-view> </router-view>
</keep-alive>

// 缓存多个组件 数组形式
<keep-alive :includes=“['News','Message']”>
  <router-view> </router-view>
</keep-alive>

includes:指定缓存的组件 【设置组件名】

  • 缓存组件后,有可以利用激活失活的组件生命周期来完成显示与隐藏的监听
  activated () {
     // 组件激活时触发
  },
  deactivated () {
     // 组件失活时触发
  },

路由守卫

  • 全局守卫
    为VueRouter对象设置beforeEach或afterEach函数
  1. 全局前置守卫 beforeEach :【初始化】时执行、每次路由【切换前】执行
    router.beforeEach((to, from, next) => guard(to, from, next, options))
    to:去哪个路由
    from:来自哪个路由
    next():放行
  2. 全局后置守卫 afterEach: 【初始化】时执行、每次路由【切换后】执行
    router.afterEach((to, from) => guard(to, from, options))
    后置守卫没有next函数。
    可以用来修改网页页签标题
router.afterEach((to,from)=>{
  document.title = to.meta.title || 'xx系统'
})
  • 路由独享路由守卫 beforeEnter
    路由独享守卫 只有前置,没有后置!在路由配置中添加beforeEnter函数

{
   name:'home',
   path: '/home',
   component: Home,
   //独享前置路由守卫
   beforeEnter:(to,from,next)=>{
      //逻辑和全局路由配置一样
      //to是你要跳转到那个路由组件
      //from是你从哪个路由组件跳转过来的
      //可以在next()前设置条件,当符合条件就放行,比如:
      if(localStorage.getItem('token')){
        next()
      }
    }
  children: [{
       name:'message/:id/:title', //占位符
       path: "message",
        component: Message
   }]
}
  • 组件内路由守卫
    beforeRouteEnter : 通过路由规则,进入该组件时被调用
    beforeRouteUpdate : 通过路由规则,该组件被复用时调用
    beforeRouteLeave : 通过路由规则,离开该组件时被调用
  beforeRouteEnter (to, from, next) {
    // ...
  },
  beforeRouteLeave (to, from, next) {
    // ...
  },

----

路由元信息 meta

定义路由的时候可以配置meta字段,meta是一个对象
通过$route.meta获取元信息
使用场景:可以控制组件的隐藏与显示

路由器工作模式

history模式与hash模式
  1. 对于一个url来说,什么是hash值?
    hash值是指一个url中,#后面的内容,它是用来表示一个页面的某个位置

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

  3. hash模式:
    1.1 url中永远带着 #
    1.2 兼容性好
    1.3 无需刷新页面
    1.4 分享给App时,若App校验严格,地址会被标记为不合法

  4. history模式:
    1.1 url中不会带着 #
    1.2 兼容性较差
    1.3 应用上线需后端人员配合解决刷新页面报404的问题

  5. history模式下解决404的问题
    针对node服务器解决方案:
    使用服务器中间件 connect-history-api-fallback
    const history = require('connect-history-api-fallback')
    app.use(history())

node服务器部署前端项目

npm init
npm i express
npm server


image.png
const express = require("express");
const app = express();

// 解决history模式刷新页面出现404的问题
// 使用服务器中间件 connect-history-api-fallback
// const history = require('connect-history-api-fallback')
// app.use(history())

// 中间件
app.use(express.static(__dirname+'/static'))//指定静态资源

app.get("/person", (req, res) => {
    res.send({
        name:'张三',
        age:20
    });
});
app.listen(5005, (err) => {
    console.log("Server is running on port 5005");
})

路由重定向

在项目运行时,访问/,立马让他定向到首页

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,377评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,390评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,967评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,344评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,441评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,492评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,497评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,274评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,732评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,008评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,184评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,837评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,520评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,156评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,407评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,056评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,074评论 2 352

推荐阅读更多精彩内容