系统性学习vue-vue-router

vue-router

  • 路由的简介
    • SPA
    • 路由
  • 路由的基本使用
    • 安装
    • 引入
    • 使用
      • 标签式
      • 编程式
    • 注意
  • 嵌套(多级)路由
  • 路由传参
    • query参数
    • params参数
  • 命名路由
  • 路由的props配置
  • router-link的replace属性
  • 编程式路由导航
    • 路由跳转
    • 后退和前进
  • 缓存路由组件
  • 两个新的生命周期钩子函数
  • 路由守卫
    • 全局前置守卫
    • 全局后置守卫
    • 独享路由守卫
    • 组件内路由守卫
  • history模式和hash模式
  • element-ui基本使用

路由的简介

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

SPA

SPA(single page web application)单页面web应用
SPA整个应用只有一个完整的页面
SPA点击页面中的导航链接不会刷新页面,只会做页面的局部更新,数据需要通过ajax请求获取

![(https://img-blog.csdnimg.cn/direct/626d4f7fe214443788b2aa6681181eea.gif)

路由

一个路由就是一组映射关系(key-value)
key为路径,value可能是function或component
有前端路由也有后端路由:前端路由-key对应组件;后端路由-key对应函数

观察下面动图,前面点击文档和API时页面并没有刷新且页面头部并没有变化,只是路径和页面下部发生了变化,而点击“演练场”时直接跳转到另一个页面了
在这里插入图片描述

路由的基本使用

安装

注意:目前vue-router最新版本是4,只支持vue3;当前使用的是vue2所以要下2版本的
npm i vue-router@3

引入

//main.js
import VueRouter from "vue-router";
//...
Vue.use(VueRouter);

引入完成后,我们就可以在创建Vue中传入router配置项
首先创建router文件
在这里插入图片描述
配置上了两个路由
About和Home是两个路由组件

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

// 引入组件
import About from "../components/About";
import Home from "../components/Home";

Vue.use(VueRouter);

// 创建并暴露一个路由器
export default new VueRouter({
  // 配置路由
  routes: [
    {
      path: "/about",
      component: About,
    },
    {
      path: "/home",
      component: Home,
    },
  ],
});

然后在vue实例中配置(感觉和vuex一样一样的)

new Vue({
  render: (h) => h(App), //将App组件放入容器中
  // ...
  router,
  //...
}).$mount("#app"); //绑定模板

看浏览器中路径,有个#说明配置成功了
在这里插入图片描述

使用

标签式

在组件中使用<router-link>标签,其实解析后就是<a>标签
to是跳转路由path,activeClass是激活状态class

<div class="row">
  <router-link to="/about" active-class="active">About</router-link>
  <router-link to="/home" active-class="active">Home</router-link>
</div>

而组件展示的位置用<router-view>

<!-- 指定组件呈现位置 -->
<router-view></router-view>

运行结果
在这里插入图片描述

编程式

还有一种编程式路由之后讲

注意

  • 上面的Home和About是路由组件
    而之前使用的是一般组件,用<>标签引用
    所以为了区分这两个组件,一般要在components平级创建一个pages文件夹存放路由组件
    在这里插入图片描述
  • 当一个路由组件不需要显示时,会直接将组件销毁,需要显示时再次挂载
  • 我们将路由组件输出,可以看到多出来两个东西
    $route是每个路由组件都有的专属属性,存储着自己的路由信息
    $router是整个应用的路由器,只有一个,来管理路由
    在这里插入图片描述

嵌套(多级)路由

路由套路由
如下在Home下再添加两个路由
注意:子路由的path不要写成"/home/news"或者"/news"router会给拼好的

// 创建并暴露一个路由器
export default new VueRouter({
  // 配置路由
  //   一级路由
  routes: [
    {
      path: "/about",
      component: About,
    },
    {
      path: "/home",
      component: Home,
      // 二级路由
      children: [
        {
          path: "news",
          component: News,
        },
        {
          path: "message",
          component: Message,
        },
      ],
    },
  ],
});

使用时to要写全<router-link to="/home/news" active-class="active">Home/News</router-link>

路由传参

query参数

传递参数,两种写法

<!-- 跳转路由并携带query参数,to的字符串写法 -->
<router-link :to="`/home?id=${id}i&name=${name}`" active-class="active">Home</router-link>
<!-- 跳转路由并携带query参数,to的对象写法 -->
<router-link
  :to="{
    path: '/home',
    query: {
      id,
      name,
    },
  }"
  active-class="active"
  >Home</router-link
>

接收参数

<h2>我是Home内容:Hello {{ $route.query.name }}</h2>

params参数

配置路由的地方也要修改,要写上需要传的参数

{
  path: "/home/:id/:name", //使用占位符声明接收params参数
  // path: "/home",
  component: Home,
  // ...
},
<!-- 跳转路由并携带params参数,to的字符串写法 -->
<router-link :to="`/home/${id}/${name}`" active-class="active"
  >Home</router-link
>

对象写法需要注意的是必须要用name指定路由,不可以用路径path(是一个坑)

<router-link
  :to="{
    name: 'home',
    params: {
      id,
      name,
    },
  }"
  >Home</router-link
>

接收参数

<h2>我是Home内容:Hello {{ $route.params.name }}</h2>

命名路由

就是在路由配置项中添加个name

//...
{
  name: "detail",
  path: "/detail",
  component: Detail,
},
//...

作用就是可以简化路由跳转编码

<router-link to="/home/news/detail" active-class="active"
  >Detail</router-link
>
<!-- 简化为↓ -->
<router-link :to="{ name: 'detail' }" active-class="active"
  >Detail</router-link
>

路由的props配置

接收路由参数展示时<h2>我是Home内容:Hello {{ $route.params.name }}</h2>
会不会觉的获取的比较繁琐
这里就要使用props了
需要先在路由上配置

{
   name: "home",
   path: "/home/:id/:name", //传递params参数
   // path: "/home",
   component: Home,
   // props的第一种写法,值为对象,对对象中的所有key-value都会以props的形式传给对应的组件
   // props: { a: 1, b: 333 }, // 但是不推荐,因为只能写死数据
   // props的第二种写法,值为布尔,若为真就会把该路由组件收到的所有params参数,以props的形式传给Detail组件
   // props: true, //只能与params配合使用
   // props的第三种写法,值为函数
   props($router) {
     return { id: $router.query.id, name: $router.query.name };
   },
   // 或者用结构赋值简写
   //  props({query:{id,name}}) {
  //  return { id,name };
  // },
  //...
}

在组件上用props接收使用(就是父组件传参那样)

props: ["id", "name"],
<h2>我是Home内容:Hello {{ name }}</h2>

router-link的replace属性

每一次点击router-link默认都会将历史记录push到一个栈中,指针指向当前展示的页面
每次点击浏览器的后退键,就会让指针指向上一个记录页面也会变成上一个记录的样式
在这里插入图片描述
而可以通过配置将push模式改为replace模式
即每次跳转都会覆盖前一个历史记录
在router-link加个replace属性就可以了

<router-link replace to="/about" active-class="active">About</router-link>

编程式路由导航

路由跳转

<button @click="toHome">点击跳转Home组件</button>
toHome() {
  this.$router.push({
    name: "home",
    params: {
      id: this.id,
      name: this.name,
    },
  });
},

当然也能用replace,push改为replace就行

后退和前进

back() {
  // 后退
  // this.$router.back();
  // 后退多步
  this.$router.go(-2);
},
forward() {
  // 前进
  this.$router.forward();
  // 前进多步
  // this.$router.go(2);
},

缓存路由组件

之前知识点:路由组件不显示默认是会销毁掉,再次显示时再重新挂载
但有时我们需要对页面上的数据进行缓存
就可以用<keep-alive>标签包裹路由组件显示位置,可以添加include来配置想缓存的组件名称(这里注意要记得在组件里配置name)
如下代码就是要将Home组件内容进行缓存,而About不进行缓存

<keep-alive include="Home">
  <!-- 指定组件呈现位置 -->
  <router-view></router-view>
</keep-alive>

效果如下
在这里插入图片描述
缓存多个组件,应该猜到了

<keep-alive :include="['Home','About']">

两个新的生命周期钩子函数

想象一个场景(懒得写实例了)
两个路由组件可以来回切换,且都为缓存路由组件,
第一个组件上在mounted设置了一个定时器setInterval实现透明渐变效果,并在beforeDestory里销毁的定时器clearInterval
从第一个路由组件切换到第二个路由组件后,会发现定时器并没有被销毁,一直在执行,是因为组件并没有被销毁,这并不是我们想得到的
咋整?
引出两个路由组件独有的生命周期钩子激活:activated失活:deactivated (就是onShow和onHide)

tips:之前声明周期图中有三个钩子函数没有写在上面,激活和失活,还有一个就是nextTick

路由守卫

就是切换路由组件时进行操作
需要再touter/index.js中配置

全局前置守卫

当需要在跳转前检查权限等操作,无权限则不跳转,就需要用到前置路由守卫
首先不能先直接暴露,要在最后暴露
通过beforeEach钩子函数来控制放行,next是用来放行,不写就不会跳转

//...
const router = new VueRouter({
//...
})
// 全局前置路由守卫 初始化以及每次路由切换前调用
// to-前往的路由信息 from-来自的路由信息 next-放行
router.beforeEach((to, from, next) => {
  console.log("to:", to);
  console.log("from:", from);
  next();
});

export default router;

在这里插入图片描述
就可以在beforeEach中根据条件和目的信息等来判断是否放行

还有个问题是当我们需要检查权限的页面很多时,那判断语句就会很长,
优化方法是使用路由中的一个配置项:meta元信息-用于添加一些自定义的数据

{
  name: "about",
  path: "/about",
  component: About,
  meta: {
    isAuth: true,
  },
},

这样在beforeEach中判断,直接用if (to.meta.isAuth){//权限判断}

全局后置守卫

当我们需要再路由正确切换后再进行一些操作时,就用后置路由守卫
比如修改页面标题在这里插入图片描述首先要在每个需要配置的路由的meta中添加title属性

{
  name: "about",
  path: "/about",
  component: About,
  meta: {
    isAuth: true,
    title: "关于",
  },
},

在后置路由守卫中修改title

// 全局后置路由守卫 初始化以及每次路由切换后调用
// to-前往的路由信息 from-来自的路由信息
router.afterEach((to, from) => {
  document.title = to.meta.title || "我的页面";
});

有可能会遇到切换路由时,页面标题闪现数项目名称,是因为在index.html中我们配置的title就是项目名称,改为默认名称就可以了

<!--index.html-->
<!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
<title>我的页面</title>

独享路由守卫

只对某一个路由进行操作

{
  name: "about",
  path: "/about",
  component: About,
  meta: {
    isAuth: true,
    title: "关于",
  },
  // 独享路由守卫 当跳转进入当前路由之前调用
  beforeEnter: (to, from, next) => {
    // ...
  }
},

没有afterEnter

组件内路由守卫

在对应路由组件中配置的

// About.vue
// 进入守卫 通过路由规则,进入该组件时被调用
beforeRouteEnter(to, from, next) {
  // ...
},
// 离开守卫 通过路由规则,离开该组件时被调用
beforeRouteLeave(to, from, next) {
  // ...
},

history模式和hash模式

路由有两种工作模式:history模式和hash模式
默认是hash模式
可以通过mode来修改模式

const router = new VueRouter({
  // 配置路由
  mode: "history",
  //...
})

两者区别就是

hash模式
url中#及其后面的内容是hash值,hash值不会包含在http请求中,即:hash值不会带给服务器
优缺点:

  • 地址汇总永远带着#号,不美观
  • 若以后将地址通过第三方手机app分享,若app校验严格,则地址会被标记为不合法
  • 兼容性好

在这里插入图片描述

history模式
优缺点:

  • 地址干净,美观
  • 兼容性和hash模式相比略差
  • 应用部署上线时需要后端人员支持,解决刷新页面服务端404问题

在这里插入图片描述

element-ui基本使用

移动端常用UI组件库:

  • Vant
  • Cube UI
  • Mint UI

PC端常用UI组件库

  • Element UI
  • IView UI

当使用Element-UI时,按照官网写完整引入,会将所有的组件及样式都引入进来以方便直接使用,就会导致最后包体很大
所以需要按需引入,官网下面就有,看去吧
需要注意的几点:

  1. .babelrc文件就是babel.config.js
  2. 原始的配置不要删掉,要追加
  3. 报错Plugin/Preset files are not allowed to ...["es2015", { "modules": false }]应该改为["@babel/preset-env", { "modules": false }]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/343614.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python中的os模块

目录 1、获取当前路径 2、获取父级路径 3、更改路径 4、罗列当前路径下方所有内容 5、创建文件夹 6、创建多级文件夹 7、删除文件夹 8、删除文件 9、重命名文件 10、walk 11、path os 是 Python的内置模块之一&#xff0c;提供了与操作系统交互的功能。它可以用于执…

Vue3 ref与reactive

✨ 专栏介绍 在当今Web开发领域中&#xff0c;构建交互性强、可复用且易于维护的用户界面是至关重要的。而Vue.js作为一款现代化且流行的JavaScript框架&#xff0c;正是为了满足这些需求而诞生。它采用了MVVM架构模式&#xff0c;并通过数据驱动和组件化的方式&#xff0c;使…

深度学习技巧应用33-零门槛实现模型在多个GPU的分布式流水线训练的应用技巧

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下深度学习技巧应用33零门槛实现模型在多个GPU的分布式流水线训练的应用技巧&#xff0c;本文将帮助大家零门槛的实现模型在多个GPU的并行训练&#xff0c;如果你手头上没有GPU资源&#xff0c;根据本文的介绍也可实现…

如何测试python 版本与 torch 、 torchvision 版本是否对应?

python 版本与 torch 、 torchvision 版本的对应关系如下图所示&#xff1a; 打开 anaconda powershell prompt&#xff0c;输入如下命令&#xff1a; >python>>>import torch>>>c torch.ones((3,1)) //创建矩阵>>>c c.cuda(0) …

备考 | 2024年NOC大赛 15套图形化编程、Python、C++初复决赛真题试卷

为了让大家备考2024年NOC大赛&#xff0c;今天给大家分享全国中小学信息技术创新与实践大赛(NOC大赛&#xff09;2023年图形化编程Scratch小低组、小高组初赛复赛决赛6套真题试卷&#xff0c;Python编程小高组、初中组初赛复赛决赛6套真题试卷&#xff0c;C编程初中组初赛复赛决…

『论文阅读|2024 WACV 多目标跟踪Deep-EloU|纯中文版』

论文题目&#xff1a; Iterative Scale-Up ExpansionIoU and Deep Features Association for Multi-Object Tracking in Sports 论文特点&#xff1a; 作者提出了一种迭代扩展的 ExpansionIoU 和深度特征关联方法Deep-EIoU&#xff0c;用于体育场景中的多目标跟踪&#xff0c;旨…

选现货白银投资划不划算?

可以肯定的是选择现货白银投资是划算的&#xff0c;但投资者需要有足够的知识和经验&#xff0c;以及对市场的敏锐观察力。只有这样&#xff0c;投资者才能在现货白银投资中获取收益。在投资市场上&#xff0c;白银作为一种特殊的投资品种&#xff0c;一直以来都备受投资者们的…

macOS跨进程通信: TCP Socket 创建实例

macOS跨进程通信: TCP Socket 创建实例 一&#xff1a; 简介 Socket 是 网络传输的抽象概念。 一般我们常用的有Tcp Socket和 UDP Scoket&#xff0c; 和类Unix 系统&#xff08;包括Mac&#xff09;独有的 Unix Domain Socket&#xff08;UDS&#xff09;。 Tcp Socket 能够…

东莞UG逆向建模设计汽车内外饰出stp图抄数3d造型建模代画图服务

汽车内外饰三维扫描及逆向建模是一项复杂且技术性强的工程。它涉及到使用高精度的三维扫描仪对汽车内外饰进行全面、细致的扫描&#xff0c;获取其精确的三维数据。这个过程中&#xff0c;需要确保扫描的环境、光线、角度等因素对扫描结果的影响最小化&#xff0c;以保证获取的…

【测试开发八股文】算法

1、栈和队列 1&#xff09;栈&#xff1a;先进后出&#xff1b;队列&#xff1a;先进先出 2&#xff09;如何用栈实现队列&#xff1f; 分析&#xff1a;两个栈&#xff0c;栈1负责入队&#xff0c;栈2负责出队 改进点&#xff1a;出队时&#xff0c;栈2出队后&#xff0c;可不…

python基础——线程

线程的使用 from threading import Thread import time def func(i):print("start{}".format(i))time.sleep(1)print("end{}".format(i)) for i in range(10):Thread(targetfunc,args(i,)).start() 守护线程的使用 主进程结束时&#xff0c;守护线程不会…

常用芯片学习——HC244芯片

HC573 三态输出八路缓冲器|线路驱动器 使用说明 SNx4HC244 八路缓冲器和线路驱动器专门设计用于提高三态存储器地址驱动器、时钟驱动器以及总线导向接收器和发送器的性能和密度。SNx4HC244 器件配备两个具有独立输出使能 (OE) 输入的 4 位缓冲器和驱动器。当 OE 为低电平时&a…

1. Matplotlib的Figure基础概念

1. Matplotlib的Figure基础概念 一 **角色和作用**二 **类比&#xff1a;**三 **基本使用示例** Matplotlib是一个用于绘制二维图形的Python库&#xff0c;广泛应用于数据可视化领域。其灵活性和强大的功能使得用户能够轻松创建各种类型的图表&#xff0c;包括折线图、散点图、…

node 第二十二天 mongoDB最新版7.x安装教程

学习服务端其实就是学习数据库, 就web这一条线而言, 客户端的学习就是学习浏览器, 而服务端的学习就是学习数据库(当然还有服务器) 为什么学习mongoDB mongoDB是非关系型数据库(not only sql) 基本上补全了mysql的缺陷, 当然也缺失了部分mysql的优势. 当然, 非大型应用的业务场…

linux中文件锁定--flock命令

在Linux操作系统中&#xff0c;flock是一个用于文件锁定的命令。文件锁定是一种机制&#xff0c;用于在多任务和多用户环境中管理对共享资源&#xff08;如文件&#xff09;的访问。flock允许你在代码中设置锁&#xff0c;以确保在任何给定时刻只有一个进程可以访问被锁定的文件…

leetcode—— 腐烂的橘子

腐烂的橘子 在给定的 m x n 网格 grid 中&#xff0c;每个单元格可以有以下三个值之一&#xff1a; 值 0 代表空单元格&#xff1b;值 1 代表新鲜橘子&#xff1b;值 2 代表腐烂的橘子。 每分钟&#xff0c;腐烂的橘子 周围 4 个方向上相邻 的新鲜橘子都会腐烂。 返回 直到…

Leetcode刷题(二十八)

找出字符串中第一个匹配项的下标&#xff08;Easy&#xff09; 给你两个字符串 haystack 和 needle &#xff0c;请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标&#xff08;下标从 0 开始&#xff09;。如果 needle 不是 haystack 的一部分&#xff0c;则返…

数据链路层流量控制与传输层流量控制对比

目录 一.数据链路层 1.停止等待协议 无差错情况&#xff1a; 有差错情况&#xff1a; 2.滑动窗口协议 &#xff08;1&#xff09;后退N帧协议&#xff08;GBN&#xff09; &#xff08;2&#xff09;选择重传协议&#xff08;SR&#xff09; 二.传输层 1.传输层的可靠…

Github2024-01-23 开源项目日报 Top9

根据Github Trendings的统计&#xff0c;今日(2024-01-23统计)共有9个项目上榜。根据开发语言中项目的数量&#xff0c;汇总情况如下&#xff1a; 开发语言项目数量Python项目3Go项目2TypeScript项目2Dart项目1Jupyter Notebook项目1 gpt4free 语言模型集合改进计划 创建周期…

基于 LangChain 框架,向量数据库如何创建、读取、更新、删除(CRUD)

RAG是目前大语言模型从工具走向生产力实践的最热门的方式&#xff0c;它可以实现从海量的文本数据中检索相关的信息&#xff0c;并用于生成高质量的文本输出。 而聊到RAG&#xff0c;我们就很难避开使用RAG的基础设施-向量数据库 今天我将带领大家&#xff0c;以最为基础的CRU…
最新文章