美文网首页
vue-router路由

vue-router路由

作者: 渚清与沙白 | 来源:发表于2023-11-02 16:34 被阅读0次

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");
})

路由重定向

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

相关文章

  • 手写 Vue Router、手写响应式实现、虚拟 DOM 和 D

    Vue-Router 原理实现 一、Vue-Router 动态路由 二、Vue-Router 嵌套路由 三、Vue...

  • vue-router学习总结

    1.引入vue-router npm install vue-router --save 2.设置路由(1)路由实...

  • 2018-09-24 vue.js vue-router

    vue-router Vue路由器 Git 安装 npm install vue-router 路由中有三个...

  • 路由

    路由map 路由视图 路由导航 实现简单路由 import VueRouter from 'vue-router'...

  • vue路由

    路由:vue-router 案例: 1.路由 2.路由的嵌套

  • Vue 基础 - 前端路由

    使用vue-router实现前端路由 安装vue-router: 配置路由文件,并在vue实例中导入: 设置视图(...

  • 10. vue-router 路由详解

    vue2有着深度继承的路由插件,即:vue-router,其中文的API地址。 vue-router与其他的路由(...

  • 一起学Vue:路由(vue-router)

    前言 学习vue-router就要先了解路由是什么?前端路由的实现原理?vue-router如何使用?等等这些问题...

  • vue-router用法记录

    Vue-Router简介 Vue-Router是Vue.js官方维护的路由插件,同时也是官方推荐的路由插件。它与V...

  • Vue-Router学习总结

    什么是路由? vue-router这里的路由就是SPA(单页应用)的路径管理器。通俗的说,vue-router就是...

网友评论

      本文标题:vue-router路由

      本文链接:https://www.haomeiwen.com/subject/izoybdtx.html