系统性学习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.mzph.cn/news/642628.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

让二叉树无处可逃

志不立&#xff0c;天下无可成之事。 ——王阳明 二叉树 1、树&#xff1f;什么是树1、1、基本概念1、2、树的相关概念1、3、树的表示方式1、4、树的实际运用 2、二叉树&#xff1f;只有两个分支吗&#xff1f;2、1、基本概念2、2、二叉树的相关定义2、3、二叉树的相关性质2、4…

C++: vector

目录 1.vector的介绍 2.vector常用的接口 1.vector构造 2.迭代器iterator的使用 3.vector空间增长 4.vector的增删改查 3.vector模拟实现 如果在reverse时使用memcpy会怎么样&#xff1f; 1.vector的介绍 C中的vector是一个动态数组容器&#xff0c;可以存储任意类型的…

simulink限幅模块-Saturation

限幅模块 限幅模块&#xff08;Saturation&#xff09;对输出值施加了上下限约束。当输出值超过上限时&#xff0c;限定于上限值输出&#xff1b;当输出值低于下限时&#xff0c;限定于下限值输出&#xff1b;在上下限之间时&#xff0c;保持原输出。Saturation模块默认包含一…

网络安全--防御保护02

第二天重要的一个点是区域这个概念 防火墙的主要职责在于控制和防护---安全策略---防火墙可以根据安全策略来抓取流量之后做出对应的动作 防火墙的分类&#xff1a; 单一主机防火墙&#xff1a;专门有设备作为防火墙 路由集成&#xff1a;核心设备&#xff0c;可流量转发 分…

为什么单片机不能直接驱动继电器和电磁阀?

为什么单片机不能直接驱动继电器和电磁阀&#xff1f; 在开始前我有一些资料&#xff0c;是我根据网友给的问题精心整理了一份「单片机的资料从专业入门到高级教程」&#xff0c; 点个关注在评论区回复“888”之后私信回复“888”&#xff0c;全部无偿共享给大家&#xff01;&…

vue3源码(一)搭建开发环境

Monorepo:是管理项目代码的一个方式&#xff0c;指在一个项目仓库(repo)中管理多个模块/包(package) vue3源码采用Monorepo管理项目 vue3项目架构 搭建Monorepo环境 1.全局安装pnpm npm install pnpm -g # 全局安装pnpm pnpm init -y # 初始化配置文件创建.npmrc文件&#x…

Docker基础语法

目录 一.docker安装 二.docker基础名词 三.docker基础命令 四.命令别名 五.数据卷 六.挂载本地目录或文件 七.Docker镜像 八.网络 一.docker安装 1.安装yum工具 yum install -y yum-utils device-mapper-persistent-data lvm2 2.安装 docker yum源 yum-config-manag…

EXECL 单元格字符串链接 CONCAT :应用:将一行数据转为json

源&#xff1a; 目标 函数表示 CONCAT("data", CHAR(10), "{", CHAR(10), " ", "ulAlarmId : ", A5, CHAR(10), " ", "ulAlarmLevel : ", D5, CHAR(10)," ", "bBo…

JavaEE-微服务-Vuex

Vuex 2.1 什么是Vuex Vuex 是一个专为 Vue.js 应用程序开发的状态管理模式。 Vuex在组件之间共享数据。 2.2 使用 vue cli 构建项目 2.3 入门案例 2.3.1 定义数据 export default new Vuex.Store({state: { // 状态区域&#xff08;定义变量区域&#xff09;user: ,toke…

Ubuntu Desktop 隐藏 / 显示文件和文件夹

Ubuntu Desktop 隐藏 / 显示文件和文件夹 1. GUI hot key2. Show hidden and backup filesReferences 1. GUI hot key Ctrl H: 隐藏 / 显示文件和文件夹 2. Show hidden and backup files Edit -> Preferences -> Views References [1] Yongqiang Cheng, https://yo…

梳理Langchain-Chatchat知识库API接口

一.Langchain-Chatchat 知识库管理 1.Langchain-Chatchat 对话和知识库管理界面 Langchain-Chatchat v0.28 完整的界面截图&#xff0c;如下所示&#xff1a; 2.知识库中源文件和向量库 知识库 test 中源文件和向量库的位置&#xff0c;如下所示&#xff1a; 3.知识库表结构 k…

一夜暴增200城,智驾开城秘诀在哪?小鹏、理想、大疆等各有不同

作者 |Marshall 编辑 |祥威 一夜过后&#xff0c;城市NOA可用范围突然增至两百多城市&#xff0c;这是最近小鹏的智驾给大家的印象。 我们曾在「特斯拉、小鹏开路&#xff0c;城市NOA距好用还有几年&#xff1f;」一文中&#xff0c;探讨了城市NOA落地过程中所面临的地图问题…

vue3-组件基础

什么是组件 组件允许我们将 UI 划分为独立的、可重用的部分&#xff0c;并且可以对每个部分进行处理。在实际应用中&#xff0c;组件常常被组织成层层嵌套的树状结构。 定义一个组件 我们一般会将 Vue 组件定义在一个单独的 .vue 文件中&#xff0c;这被叫做单文件组件 (简称…

TypeScript 实用技巧(中)

十四、向类型添加特殊值 原文&#xff1a;exploringjs.com/tackling-ts/ch_special-values.html 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 14.1 在带内添加特殊值 14.1.1 向类型添加 null 或 undefined 14.1.2 向类型添加符号 14.2 在带外添加特殊值 14.2…

[亲测有效]CentOS7下安装mysql5.7

前言 近期项目需要搭配mysql一起存储相关数据&#xff0c;但对mysql的版本有要求&#xff0c;于是在服务器搭建了mysql5.7&#xff0c;顺便记录一下搭建步骤和踩坑解决步骤。 目录 前言 一、清除旧安装包 二、安装YUM 三、使用yum命令即可完成安装 四、重新设置密码 五、…

文心一言 v.s. ChatGPT:多角度对比测评“追赶者”能否超越?

ChatGPT自发布以来就引发了关注热潮&#xff0c;如今国内大模型的发展也是如火如荼、百花齐放&#xff1a;比如百度的文心一言、阿里的通义千问、讯飞的星火大模型等等&#xff0c;那么作为后起之秀的国内大模型与ChatGPT相比哪个更好用呢&#xff1f;“追赶者”能否实现超越&a…

使用Unity创建VisionPro应用

1、下载特定Unity版本 Unity账号需要是Pro账号,普通账号不行,目前只支持这1个Unity版本,不要下载任何其它版本:unityhub://2022.3.11f1/d00248457e15) 其它条件:使用Mac电脑M系列芯片,XCode15 Beta2及以上 参考资料: 苹果官网:苹果官网 Unity官网:Unity官网 官方教程…

Network:use `--host` to expose

前言&#xff1a; 最近开始学习使用vite创建项目&#xff0c;但是 vite 启动后提示&#xff1a;Network:use --host to expose&#xff0c;从而导致在同一个局域网内的其他人也无法访问到我本地的项目。 导致原因&#xff1a;通过官方文档了解到不显示地址是因为IP没有做配置&a…

浏览器无网

目录 1.运行网络诊断&#xff0c;确认原因 原因A.远程计算机或设备将不接受连接(该设备或资源(Web 代理)未设置为接受端口“7890”上的连接 原因B.DNS服务器未响应 场景A.其他的浏览器可以打开网页&#xff0c;自带的Edge却不行 方法A&#xff1a;关闭代理 Google自带翻译…

【江科大】STM32:中断系统(理论)

文章目录 中断系统为什么要使用中断中断优先级中断嵌套STM32的中断系统如何管理这些中断NVIC的结构![请添加图片描述](https://img-blog.csdnimg.cn/c77b038fd63a4ddfbcd3b86f6dfe596b.png) 优先级窗口看门狗&#xff08;WWDG&#xff09;&#xff1a;外部中断模块的特性&#…