0


vue3学习笔记

文章目录


ES6模块化与异步编程高级用法

1. ES6 模块化

1.1 node.js 中如何实现模块化

node.js 遵循了 CommonJS 的模块化规范。其中:

  • 导入其它模块使用 require() 方法
  • 模块对外共享成员使用 module.exports 对象

模块化的好处:

大家都遵守同样的模块化规范写代码,降低了沟通的成本,极大方便了各个模块之间的相互调用,利人利己。

1.2 前端模块化规范的分类

在 ES6 模块化规范诞生之前,JavaScript 社区已经尝试并提出了 AMD、CMD、CommonJS 等模块化规范。

但是,这些由社区提出的模块化标准,还是存在一定的差异性与局限性、并不是浏览器与服务器通用的模块化标准,例如:

  • AMD 和 CMD 适用于浏览器端的 Javascript 模块化
  • CommonJS 适用于服务器端的 Javascript 模块化

太多的模块化规范给开发者增加了学习的难度与开发的成本。因此,大一统的 ES6 模块化规范诞生了!

1.3 什么是 ES6 模块化规范

ES6 模块化规范浏览器端服务器端通用的模块化开发规范。它的出现极大的降低了前端开发者的模块化学习成本,开发者不需再额外学习 AMD、CMD 或 CommonJS 等模块化规范。

ES6 模块化规范中定义:

  • 每个 js 文件都是一个独立的模块
  • 导入其它模块成员使用 import 关键字
  • 向外共享模块成员使用 export 关键字

1.4 在 node.js 中体验 ES6 模块化

node.js 中默认仅支持 CommonJS 模块化规范,若想基于 node.js 体验与学习 ES6 的模块化语法,可以按照如下两个步骤进行配置:

​ ① 确保安装了 v14.15.1 或更高版本的 node.js

​ ② 在 package.json 的根节点中添加 “type”: “module” 节点

1.5 ES6 模块化的基本语法

ES6 的模块化主要包含如下 3 种用法:

​ ① 默认导出默认导入

​ ② 按需导出按需导入

​ ③ 直接导入执行模块中的代码

1. 默认导出

默认导出的语法:

 export default

默认导出的成员

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1D3419Gt-1650958972713)(D:\A_study\Vue\vue3_study_image\a1.png)]

2. 默认导入

默认导入的语法:

 import 接收名称 from '模块标识符'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0oIJfr8I-1650958972714)(D:\A_study\Vue\vue3_study_image\a2.png)]

3. 默认导出的注意事项

每个模块中,只允许使用唯一的一次 export default,否则会报错!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t6vO6NM8-1650958972715)(D:\A_study\Vue\vue3_study_image\a3.png)]

4. 默认导入的注意事项

默认导入时的接收名称可以任意名称,只要是合法的成员名称即可:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Z1VDU6VA-1650958972715)(D:\A_study\Vue\vue3_study_image\a4.png)]

5. 按需导出

按需导出的语法: export 按需导出的成员

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-51gd3J15-1650958972716)(D:\A_study\Vue\vue3_study_image\a5.png)]

6. 按需导入

按需导入的语法:

import { s1 } from '模块标识符'

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lSYoDKml-1650958972716)(D:\A_study\Vue\vue3_study_image\a6.png)]

7. 按需导出与按需导入的注意事项

​ ① 每个模块中可以使用多次按需导出

​ ② 按需导入的成员名称必须和按需导出的名称保持一致

​ ③ 按需导入时,可以使用 as 关键字进行重命名

​ ④ 按需导入可以和默认导入一起使用

8. 直接导入并执行模块中的代码

如果只想单纯地执行某个模块中的代码,并不需要得到模块中向外共享的成员。此时,可以直接导入并执行模块代码,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-X6VXbEG7-1650958972717)(D:\A_study\Vue\vue3_study_image\a7.png)]

2. Promise

2.1 回调地狱

多层回调函数的相互嵌套,就形成了回调函数。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qu9ND88m-1650958972717)(D:\A_study\Vue\vue3_study_image\a8.png)]

1. 如何解决回调地狱的问题

为了解决回调函数的问题,ES6(ECMAScript 2015)中新增了 Promise 的概念。

2. Promise 的基本概念

Promise 是一个构造函数

  • 我们可以创建 Promise 的实例 const p = new Promise()
  • new 出来的 Promise 实例对象,代表一个异步操作

② Promise.prototype 上包含一个

.then()

方法

  • 每一次 new Promise() 构造函数得到的实例对象,
  • 都可以通过原型链的方式访问到 .then() 方法,例如 p.then()

③ .then() 方法用来预先指定成功和失败的回调函数

  • p.then(成功的回调函数,失败的回调函数)
  • p.then(result => { }, error => { })
  • 调用 .then() 方法时,成功的回调函数是必选的、失败的回调函数是可选的

2.2 基于回调函数按顺序读取文件内容

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EBZF2uTy-1650958972718)(D:\A_study\Vue\vue3_study_image\a9.png)]

2.3 基于 then-fs 读取文件内容

由于 node.js 官方提供的 fs 模块仅支持以回调函数的方式读取文件,不支持 Promise 的调用方式。因此,需要先运行如下的命令,安装 then-fs 这个第三方包,从而支持我们基于 Promise 的方式读取文件的内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YZJXwKvj-1650958972718)(D:\A_study\Vue\vue3_study_image\a10.png)]

1. then-fs 的基本使用

调用 then-fs 提供的 readFile() 方法,可以异步地读取文件的内容,它的返回值是 Promise 的实例对象。因此可以调用 .then() 方法为每个 Promise 异步操作指定成功和失败之后的回调函数。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-QNdXVDWY-1650958972719)(D:\A_study\Vue\vue3_study_image\a11.png)]

注意:上述的代码无法保证文件的读取顺序,需要做进一步的改进!

import thenFs from 'then-fs'

thenFs.readFile('./files/1.txt','utf8').then((r1) => {console.log(r1)})
thenFs.readFile('./files/2.txt','utf8').then((r2) => {console.log(r2)})
thenFs.readFile('./files/3.txt','utf8').then((r3) => {console.log(r3)})

2. .then() 方法的特性

如果上一个 .then() 方法中返回了一个新的 Promise 实例对象,则可以通过下一个

.then()

继续进行处理。通过

.then() 

方法的链式调用,就解决了回调地狱的问题

3. 基于 Promise 按顺序读取文件的内容

Promise 支持链式调用,从而来解决回调地狱的问题。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cMQFuuCw-1650958972719)(D:\A_study\Vue\vue3_study_image\a12.png)]

4. 通过 .catch 捕获错误1

在 Promise 的链式操作中如果发生了错误,可以使用 Promise.prototype.catch 方法进行捕获和处理:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MAGemzv4-1650958972719)(D:\A_study\Vue\vue3_study_image\a13.png)]

5. 通过 .catch 捕获错误2

如果不希望前面的错误导致后续的 .then 无法正常执行,则可以将 .catch 的调用提前,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZWGD8OkA-1650958972720)(D:\A_study\Vue\vue3_study_image\a14.png)]

6. Promise.all() 方法

Promise.all() 方法会发起并行的 Promise 异步操作,等所有的异步操作全部结束后才会执行下一步的

.then

操作(等待机制)。示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1hyz87Iz-1650958972720)(D:\A_study\Vue\vue3_study_image\a15.png)]

注意:数组中 Promise 实例的顺序,就是最终结果的顺序

7. Promise.race() 方法

Promise.race() 方法会发起并行的 Promise 异步操作,只要任何一个异步操作完成,就立即执行下一步的 .then 操作(赛跑机制)。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RbZwfRnK-1650958972720)(D:\A_study\Vue\vue3_study_image\a16.png)]

2.4 基于 Promise 封装读文件的方法

方法的封装要求:

​ ① 方法的名称要定义为 getFile

​ ② 方法接收一个形参 fpath,表示要读取的文件的路径

​ ③ 方法的返回值为 Promise 实例对象

1. getFile 方法的基本定义

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UMAg7w0f-1650958972721)(D:\A_study\Vue\vue3_study_image\a17.png)]

注意:第 5 行代码中的 new Promise() 只是创建了一个形式上的异步操作

2. 创建具体的异步操作

如果想要创建具体的异步操作,则需要在 new Promise() 构造函数期间,传递一个 function 函数,将具体的异步操作定义到 function 函数内部。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cERhHMRe-1650958972721)(D:\A_study\Vue\vue3_study_image\a18.png)]

3. 获取 .then 的两个实参

通过 .then() 指定的成功和失败的回调函数,可以在 function 的形参中进行接收,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9tFBObAN-1650958972722)(D:\A_study\Vue\vue3_study_image\a19.png)]

4. 调用 resolve 和 reject 回调函数

Promise 异步操作的结果,可以调用 resolve 或 reject 回调函数进行处理。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kipoZHkW-1650958972722)(D:\A_study\Vue\vue3_study_image\a20.png)]

3. async/await

3.1 什么是 async/await

async/awaitES8(ECMAScript 2017)引入的新语法,用来简化 Promise 异步操作。在async/await 出现之前,开发者只能通过链式

.then()

的方式处理 Promise 异步操作。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j2eC4cca-1650958972722)(D:\A_study\Vue\vue3_study_image\a21.png)]

  • .then 链式调用的优点:解决了回调地狱的问题
  • .then 链式调用的缺点:代码冗余、阅读性差、不易理解

3.2 async/await 的基本使用

使用 async/await 简化 Promise 异步操作的示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AyHw8cV6-1650958972723)(D:\A_study\Vue\vue3_study_image\a22.png)]

3.3 async/await 的使用注意事项

① 如果在 function 中使用了 await,则 function 必须被****async 修饰

② 在 async 方法中,第一个 await 之前的代码会同步执行,await 之后的代码会异步执行

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SozW4wVQ-1650958972723)(D:\A_study\Vue\vue3_study_image\a23.png)]

4. EventLoop

4.1 JavaScript 是单线程的语言

JavaScript 是一门单线程执行的编程语言。也就是说,同一时间只能做一件事情。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6dcC9kLm-1650958972723)(D:\A_study\Vue\vue3_study_image\a24.png)]

单线程执行任务队列的问题:

  • 如果前一个任务非常耗时,则后续的任务就不得不一直等待,从而导致程序假死的问题。

4.2 同步任务和异步任务

为了防止某个耗时任务导致程序假死的问题,JavaScript 把待执行的任务分为了两类:

同步任务(synchronous)

  • 又叫做非耗时任务,指的是在主线程上排队执行的那些任务
  • 只有前一个任务执行完毕,才能执行后一个任务

异步任务(asynchronous)

  • 又叫做耗时任务,异步任务由 JavaScript 委托给宿主环境进行执行
  • 当异步任务执行完成后,会通知 JavaScript 主线程执行异步任务的回调函数

4.3 同步任务和异步任务的执行过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eOHWtB0b-1650958972724)(D:\A_study\Vue\vue3_study_image\a25.png)]

① 同步任务由 JavaScript 主线程次序执行

② 异步任务委托给宿主环境执行

③ 已完成的异步任务对应的回调函数,会被

​ 加入到任务队列中等待执行

④ JavaScript 主线程的执行栈被清空后,会

​ 读取任务队列中的回调函数,次序执行

⑤ JavaScript 主线程不断重复上面的第 4 步

4.4 EventLoop 的基本概念

JavaScript 主线程从“任务队列”中读取异步任务的回调函数,放到执行栈中依次执行。这个过程是循环不断的,所以整个的这种运行机制又称为 EventLoop(事件循环)。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-1JbV8lNo-1650958972724)(D:\A_study\Vue\vue3_study_image\a26.png)]

4.5 结合 EventLoop 分析输出的顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-7XniGMec-1650958972724)(D:\A_study\Vue\vue3_study_image\a27.png)]

正确的输出结果:ADCB。其中:

  • A 和 D 属于同步任务。会根据代码的先后顺序依次被执行
  • C 和 B 属于异步任务。它们的回调函数会被加入到任务队列中,等待主线程空闲时再执行

5. 宏任务和微任务

5.1 什么是宏任务和微任务

JavaScript 把异步任务又做了进一步的划分,异步任务又分为两类,分别是:

① 宏任务(macrotask)

  • 异步 Ajax 请求、
  • setTimeout、setInterval、
  • 文件操作
  • 其它宏任务

② 微任务(microtask)

  • Promise.then、.catch 和 .finally
  • process.nextTick
  • 其它微任务

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9L1fTOUL-1650958972725)(D:\A_study\Vue\vue3_study_image\a28.png)]

5.2 宏任务和微任务的执行顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-O4xzS6Rw-1650958972725)(D:\A_study\Vue\vue3_study_image\a29.png)]

每一个宏任务执行完之后,都会检查是否存在待执行的微任务,如果有,则执行完所有微任务之后,再继续执行下一个宏任务。

5.3 去银行办业务的场景

① 小云和小腾去银行办业务。首先,需要取号之后进行排队

  • 宏任务队列

② 假设当前银行网点只有一个柜员,小云在办理存款业务时,小腾只能等待

  • 单线程,宏任务按次序执行

③ 小云办完存款业务后,柜员询问他是否还想办理其它业务?

  • 当前宏任务执行完,检查是否有微任务

④ 小云告诉柜员:想要买理财产品、再办个信用卡、最后再兑换点马年纪念币?

  • 执行微任务,后续宏任务被推迟

⑤ 小云离开柜台后,柜员开始为小腾办理业务

  • 所有微任务执行完毕,开始执行下一个宏任务

5.4 分析以下代码输出的顺序

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3IJ5LMxa-1650958972726)(D:\A_study\Vue\vue3_study_image\a30.png)]

5.5 经典面试题

请分析以下代码输出的顺序(代码较长,截取成了左中右 3 个部分)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-z1TxoMFD-1650958972726)(D:\A_study\Vue\vue3_study_image\a31.png)]

6. API 接口案例

6.1 案例需求

基于 MySQL 数据库 + Express 对外提供用户列表的 API 接口服务。用到的技术点如下:

  • 第三方包 express 和 mysql2
  • ES6 模块化
  • Promise
  • async/await

6.2 主要的实现步骤

① 搭建项目的基本结构

② 创建基本的服务器

③ 创建 db 数据库操作模块

④ 创建 user_ctrl 业务模块

⑤ 创建 user_router 路由模块

6.3 搭建项目的基本结构

① 启用 ES6 模块化支持

  • 在 package.json 中声明 “type”: “module”

② 安装第三方依赖包

6.4 创建基本的服务器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mg6NPm0t-1650958972726)(D:\A_study\Vue\vue3_study_image\a32.png)]

6.5 创建 db 数据库操作模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RFXRw3HA-1650958972727)(D:\A_study\Vue\vue3_study_image\a33.png)]

6.6 创建 user_ctrl 模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZfEeJyao-1650958972727)(D:\A_study\Vue\vue3_study_image\a34.png)]

6.7 创建 user_router 模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hu9EoYb0-1650958972728)(D:\A_study\Vue\vue3_study_image\a35.png)]

6.8 导入并挂载路由模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4gNdEz8A-1650958972728)(D:\A_study\Vue\vue3_study_image\a36.png)]

6.9 使用 try…catch 捕获异常

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W1k7TGI9-1650958972729)(D:\A_study\Vue\vue3_study_image\a37.png)]

7. 总结

① 能够知道如何使用 ES6 的模块化语法

  • 默认导出与默认导入、按需导出与按需导入

② 能够知道如何使用 Promise 解决回调地狱问题

  • promise.then()、promise.catch()

③ 能够使用 async/await 简化 Promise 的调用

  • 方法中用到了 await,则方法需要被 async 修饰

④ 能够说出什么是 EventLoop

  • EventLoop 示意图

⑤ 能够说出宏任务和微任务的执行顺序

  • 在执行下一个宏任务之前,先检查是否有待执行的微任务

组件(上)

1. 单页面应用程序

1.1 单页面应用程序的优点

SPA 单页面应用程序最显著的 3 个优点如下:

① 良好的交互体验

  • 单页应用的内容的改变不需要重新加载整个页面
  • 获取数据也是通过 Ajax 异步获取
  • 没有页面之间的跳转,不会出现“白屏现象”

② 良好的前后端工作分离模式

  • 后端专注于提供 API 接口,更易实现 API 接口的复用
  • 前端专注于页面的渲染,更利于前端工程化的发展

③ 减轻服务器的压力

  • 服务器只提供数据,不负责页面的合成与逻辑的处理,吞吐能力会提高几倍

1.2 单页面应用程序的缺点

任何一种技术都有自己的局限性,对于 SPA 单页面应用程序来说,主要的缺点有如下两个:

① 首屏加载慢

  • 路由懒加载
  • 代码压缩
  • CDN 加速
  • 网络传输压缩

② 不利于 SEO

  • SSR 服务器端渲染

1.3 如何快速创建 vue 的 SPA 项目

vue 官方提供了两种快速创建工程化的 SPA 项目的方式:

① 基于 vite 创建 SPA 项目

② 基于 vue-cli 创建 SPA 项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HXbv4c0h-1650958972729)(D:\A_study\Vue\vue3_study_image\b1.png)]

2. vite 的基本使用

2.1 创建 vite 的项目

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tEL9JaBf-1650958972729)(D:\A_study\Vue\vue3_study_image\b37.png)]

按照顺序执行如下的命令,即可基于 vite 创建 vue 3.x 的工程化项目:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AA8q6AAg-1650958972730)(D:\A_study\Vue\vue3_study_image\b2.png)]

2.2 梳理项目的结构

使用 vite 创建的项目结构如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RkN6LmFz-1650958972730)(D:\A_study\Vue\vue3_study_image\b3.png)]

1. 梳理项目的结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tXfdZe5q-1650958972731)(D:\A_study\Vue\vue3_study_image\b4.png)]

2.3 vite 项目的运行流程

在工程化的项目中,vue 要做的事情很单纯:通过 main.jsApp.vue 渲染到 index.html 的指定区域中。其中:

① App.vue 用来编写待渲染的模板结构

② index.html 中需要预留一个 el 区域

③ main.js 把 App.vue 渲染到了 index.html 所预留的区域中

1. 在 App.vue 中编写模板结构

清空 App.vue 的默认内容,并书写如下的模板结构:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MI27r6Z4-1650958972731)(D:\A_study\Vue\vue3_study_image\b5.png)]

2. 在 index.html 中预留 el 区域

打开 index.html 页面,确认预留了 el 区域:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MurCSYMR-1650958972731)(D:\A_study\Vue\vue3_study_image\b6.png)]

3. 在 main.js 中进行渲染

按照 vue 3.x 的标准用法,把 App.vue 中的模板内容渲染到 index.html 页面的 el 区域中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5BGtlFGx-1650958972732)(D:\A_study\Vue\vue3_study_image\b7.png)]

3. 组件化开发思想

3.1 什么是组件化开发

组件化开发指的是:根据封装的思想,把页面上可重用的部分封装为组件,从而方便项目的开发和维护。

例如:http://www.ibootstrap.cn/ 所展示的效果,就契合了组件化开发的思想。用户可以通过拖拽组件的方式,快速生成一个页面的布局结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZPBrMNFM-1650958972732)(D:\A_study\Vue\vue3_study_image\b8.png)]

3.2 组件化开发的好处

前端组件化开发的好处主要体现在以下两方面:

  • 提高了前端代码的复用性和灵活性
  • 提升了开发效率和后期的可维护性

3.3 vue 中的组件化开发

vue 是一个完全支持组件化开发的框架。vue 中规定组件的后缀名是 .vue。之前接触到的 App.vue 文件本质上就是一个 vue 的组件

4. vue 组件的构成

4.1 vue 组件组成结构

每个 .vue 组件都由 3 部分构成,分别是:

  • template -> 组件的模板结构
  • script -> 组件的 JavaScript 行为
  • style -> 组件的样式

其中,每个组件中必须包含 template 模板结构,而 script 行为和style 样式是可选的组成部分。

4.2 组件的 template 节点

vue 规定:每个组件对应的模板结构,需要定义到

<template>

节点中。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vlJxdRsa-1650958972732)(D:\A_study\Vue\vue3_study_image\b9.png)]

注意:

<template>

是 vue 提供的容器标签,只起到包裹性质的作用,它不会被渲染为真正的 DOM 元素。

1. 在 template 中使用指令

在组件的

<template>

节点中,支持使用前面所学的指令语法,来辅助开发者渲染当前组件的 DOM 结构。代码示例如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aEQC7UpV-1650958972733)(D:\A_study\Vue\vue3_study_image\b10.png)]

2. 在 template 中定义根节点

在 vue 2.x 的版本中,

<template>

节点内的 DOM 结构仅支持单个根节点

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DLQXthWh-1650958972733)(D:\A_study\Vue\vue3_study_image\b11.png)]

4.3 组件的 script 节点

vue 规定:组件内的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ARlOXUOU-1650958972733)(D:\A_study\Vue\vue3_study_image\b12.png)]

1. script 中的 name 节点

可以通过 name 节点为当前组件定义一个名称

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wLs3qcak-1650958972734)(D:\A_study\Vue\vue3_study_image\b13.png)]

2. script 中的 data 节点

vue 组件渲染期间需要用到的数据,可以定义在 data 节点中:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Imt2vOCt-1650958972734)(D:\A_study\Vue\vue3_study_image\b14.png)]

3. 组件中的 data 必须是函数

vue 规定:组件中的 data 必须是一个函数,不能直接指向一个数据对象。因此在组件中定义 data 数据节点时,下面的方式是错误的:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aNe8UOMa-1650958972734)(D:\A_study\Vue\vue3_study_image\b15.png)]

4. script 中的 methods 节点

组件中的事件处理函数,必须定义到 methods 节点中,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YlyOBe5t-1650958972735)(D:\A_study\Vue\vue3_study_image\b16.png)]

4.4 组件的 style 节点

vue 规定:组件内的

<style>

节点是可选的,开发者可以在

<style>

节点中编写样式美化当前组件的 UI 结构。

<script >

节点的基本结构如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-TQXbS8Tf-1650958972735)(D:\A_study\Vue\vue3_study_image\b17.png)]

其中

<style>

标签上的 lang=“css” 属性是可选的,它表示所使用的样式语言。默认只支持普通的 css 语法,可选值还有 less、scss 等。

1. 让 style 中支持 less 语法

如果希望使用 less 语法编写组件的 style 样式,可以按照如下两个步骤进行配置:

① 运行 npm install less -D 命令安装依赖包,从而提供 less 语法的编译支持

② 在

<style>

标签上添加 lang=“less” 属性,即可使用 less 语法编写组件的样式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6Cdcsj8x-1650958972735)(D:\A_study\Vue\vue3_study_image\b18.png)]

5. 组件的基本使用

5.1 组件的注册

组件之间可以进行相互的引用,例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KENgcylA-1650958972736)(D:\A_study\Vue\vue3_study_image\b19.png)]

vue 中组件的引用原则:先注册后使用

1. 注册组件的两种方式

vue 中注册组件的方式分为“全局注册”和“局部注册”两种,其中:

  • 全局注册的组件,可以在全局任何一个组件内使用
  • 局部注册的组件,只能在当前注册的范围内使用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nAAOF7TW-1650958972736)(D:\A_study\Vue\vue3_study_image\b20.png)]

2. 全局注册组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jgQuRUpP-1650958972736)(D:\A_study\Vue\vue3_study_image\b21.png)]

3. 使用全局注册组件

使用

app.component()

方法注册的全局组件,直接以标签的形式进行使用即可,例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cHdeA7nH-1650958972737)(D:\A_study\Vue\vue3_study_image\b22.png)]

4. 局部注册组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mWd2Orbe-1650958972737)(D:\A_study\Vue\vue3_study_image\b23.png)]

5. 全局注册和局部注册的区别

  • 被全局注册的组件,可以在全局任何一个组件内使用
  • 被局部注册的组件,只能在当前注册的范围内使用

应用场景:

如果某些组件在开发期间的使用频率很高,推荐进行全局注册;

如果某些组件只在特定的情况下会被用到,推荐进行局部注册。

6. 组件注册时名称的大小写

在进行组件的注册时,定义组件注册名称的方式有两种:

​ ① 使用 kebab-case 命名法(俗称短横线命名法,例如 my-swiper 和 my-search)

​ ② 使用 PascalCase 命名法(俗称帕斯卡命名法大驼峰命名法,例如 MySwiper 和 MySearch)

短横线命名法的特点:

  • 必须严格按照短横线名称进行使用帕斯卡命名法的特点:
  • 既可以严格按照帕斯卡名称进行使用,又可以转化为短横线名称进行使用

注意:在实际开发中,推荐使用帕斯卡命名法为组件注册名称,因为它的适用性更强。

7. 通过 name 属性注册组件

在注册组件期间,除了可以直接提供组件的注册名称之外,还可以把组件的 name 属性作为注册后组件的名称,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-LoidYHCK-1650958972737)(D:\A_study\Vue\vue3_study_image\b24.png)]

5.2 组件之间的样式冲突问题

默认情况下,写在 .vue 组件中的样式会全局生效,因此很容易造成多个组件之间的样式冲突问题。导致组件之间样式冲突的根本原因是:

​ ① 单页面应用程序中,所有组件的 DOM 结构,都是基于唯一的 index.html 页面进行呈现的

​ ② 每个组件中的样式,都会影响整个****index.html 页面中的 DOM 元素

1. 如何解决组件样式冲突的问题

为每个组件分配唯一的自定义属性,在编写组件样式时,通过属 性选择器来控制样式的作用域,示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bpZJDbUA-1650958972738)(D:\A_study\Vue\vue3_study_image\b25.png)]

2. style 节点的 scoped 属性

为了提高开发效率和开发体验,vue 为 style 节点提供了 scoped 属性,从而防止组件之间的样式冲突问题:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RwZ14GLp-1650958972738)(D:\A_study\Vue\vue3_study_image\b26.png)]

3. /deep/ 样式穿透

如果给当前组件的 style 节点添加了 scoped 属性,则当前组件的样式对其子组件是不生效的。如果想让某些样式对子组件生效,可以使用 /deep/ 深度选择器

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-L1pKkEvZ-1650958972738)(D:\A_study\Vue\vue3_study_image\b27.png)]

注意:/deep/ 是 vue2.x 中实现样式穿透的方案。在 vue3.x 中推荐使用 :deep() 替代 /deep/。

5.3 组件的 props

为了提高组件的复用性,在封装 vue 组件时需要遵守如下的原则:

  • 组件的 DOM 结构、Style 样式要尽量复用
  • 组件中要展示的数据,尽量由组件的使用者提供

为了方便使用者为组件提供要展示的数据,vue 组件提供了 props 的概念。

1. 什么是组件的 props

props 是组件的自定义属性,组件的使用者可以通过 props 把数据传递到子组件内部,供子组件内部进行使用。代码示例如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-05P7myGC-1650958972739)(D:\A_study\Vue\vue3_study_image\b28.png)]

props 的作用:父组件通过 props 向子组件传递要展示的数据

props 的好处:提高了组件的复用性

2. 在组件中声明 props

在封装 vue 组件时,可以把动态的数据项声明为 props 自定义属性。自定义属性可以在当前组件的模板结构中被直接使用。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4bajkW0V-1650958972739)(D:\A_study\Vue\vue3_study_image\b29.png)]

3. 无法使用未声明的 props

如果父组件给子组件传递了未声明的 props 属性,则这些属性会被忽略,无法被子组件使用,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2jjgCmCC-1650958972740)(D:\A_study\Vue\vue3_study_image\b30.png)]

4. 动态绑定 props 的值

可以使用 v-bind 属性绑定的形式,为组件动态绑定 props 的值,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b2jNUZ7j-1650958972740)(D:\A_study\Vue\vue3_study_image\b31.png)]

5. props 的大小写命名

组件中如果使用“camelCase (驼峰命名法)”声明了 props 属性的名称,则有两种方式为其绑定属性的值:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-I6CdVnK6-1650958972740)(D:\A_study\Vue\vue3_study_image\b32.png)]

5.4 Class 与 Style 绑定

在实际开发中经常会遇到动态操作元素样式的需求。因此,vue 允许开发者通过 v-bind 属性绑定指令,为元素动态绑定 class 属性的值和行内的 style 样式

1. 动态绑定 HTML 的 class

可以通过三元表达式,动态的为元素绑定 class 的类名。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rEdnf9iM-1650958972741)(D:\A_study\Vue\vue3_study_image\b33.png)]

2. 以数组语法绑定 HTML 的 class

如果元素需要动态绑定多个 class 的类名,此时可以使用数组的语法格式:

!b33](D:\A_study\Vue\vue3_study_image\b33.png)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qi6vk7Zz-1650958972741)(D:\A_study\Vue\vue3_study_image\b34.png)]

3. 以对象语法绑定 HTML 的 class

使用数组语法动态绑定 class 会导致模板结构臃肿的问题。此时可以使用对象语法进行简化:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5GOmpK1Z-1650958972741)(D:\A_study\Vue\vue3_study_image\b35.png)]

4. 以对象语法绑定内联的 style

:style 的对象语法十分直观——看着非常像 CSS,但其实是一个 JavaScript 对象。CSS property 名可以用驼峰式 (camelCase) 或短横线分隔 (kebab-case,记得用引号括起来) 来命名

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PqosxXIX-1650958972742)(D:\A_study\Vue\vue3_study_image\b36.png)]

6. 总结

① 能够说出什么是单页面应用程序及组件化开发

  • SPA、只有一个页面、组件是对 UI 结构的复用

② 能够说出 .vue 单文件组件的组成部分

  • template、script、style(scoped、lang)

③ 能够知道如何注册 vue 的组件

  • 全局注册(app.component)、局部注册(components)

④ 能够知道如何声明组件的 props 属性

  • props 数组

④ 能够知道如何在组件中进行样式绑定

  • 动态绑定 class、动态绑定 style

组件(下)

1. props 验证

1.1 什么是 props 验证

指的是:在封装组件时对外界传递过来的 props 数据进行合法性的校验,从而防止数据不合法的问题。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cIOPa8Y8-1650958972742)(D:\A_study\Vue\vue3_study_image\c1.png)]

使用数组类型的 props 节点的缺点:无法为每个 prop 指定具体的数据类型。

1.2 对象类型的 props 节点

使用对象类型的 props 节点,可以对每个 prop 进行数据类型的校验,示意图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f7mmNl9Q-1650958972742)(D:\A_study\Vue\vue3_study_image\c2.png)]

1.3 props 验证

对象类型的 props 节点提供了多种数据验证方案,例如:

① 基础的类型检查

② 多个可能的类型

③ 必填项校验

④ 属性默认值

⑤ 自定义验证函数

1. 基础的类型检查

可以直接为组件的 prop 属性指定基础的校验类型,从而防止组件的使用者为其绑定错误类型的数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Cdh1E7xV-1650958972743)(D:\A_study\Vue\vue3_study_image\c3.png)]

2. 多个可能的类型

如果某个 prop 属性值的类型不唯一,此时可以通过数组的形式,为其指定多个可能的类型,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-h8X2nP5Z-1650958972743)(D:\A_study\Vue\vue3_study_image\c4.png)]

3. 必填项校验

required 属性

如果组件的某个 prop 属性是必填项,必须让组件的使用者为其传递属性的值。此时,可以通过如下的方式将其设置为必填项:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kSNvNyHA-1650958972743)(D:\A_study\Vue\vue3_study_image\c5.png)]

4. 属性默认值

在封装组件时,可以为某个 prop 属性指定默认值。示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KrYnULPo-1650958972744)(D:\A_study\Vue\vue3_study_image\c6.png)]

5. 自定义验证函数

在封装组件时,可以为 prop 属性指定自定义的验证函数,从而对 prop 属性的值进行更加精确的控制

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KuUERvYQ-1650958972744)(D:\A_study\Vue\vue3_study_image\c7.png)]

2. 计算属性

2.1 什么是计算属性

计算属性本质上就是一个 function 函数,它可以实时监听 data 中数据的变化,并 return 一个计算后的新值,供组件渲染 DOM 时使用

2.2 如何声明计算属性

计算属性需要以 function 函数的形式声明到组件的 computed 选项中,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AaOKimj8-1650958972744)(D:\A_study\Vue\vue3_study_image\c8.png)]

注意:计算属性侧重于得到一个计算的结果,因此计算属性中必须有 return 返回值!

2.3 计算属性的使用注意点

① 计算属性必须定义在 computed 节点中

② 计算属性必须是一个 function 函数

③ 计算属性必须有返回值

④ 计算属性必须当做普通属性使用

2.4 计算属性 vs 方法

相对于方法来说,计算属性会缓存计算的结果,只有计算属性的依赖项发生变化时,才会重新进行运算。因此计算属性的性能更好:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-u7euOqX5-1650958972745)(D:\A_study\Vue\vue3_study_image\c9.png)]

3. 自定义事件

3.1 什么是自定义事件

在封装组件时,为了让组件的使用者可以监听到组件内状态的变化,此时需要用到组件的自定义事件。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iagFMacA-1650958972745)(D:\A_study\Vue\vue3_study_image\c10.png)]

3.2 自定义事件的 3 个使用步骤

在封装组件时:

① 声明自定义事件

② 触发自定义事件

在使用组件时:

③ 监听自定义事件

1. 声明自定义事件

开发者为自定义组件封装的自定义事件,必须事先在 emits 节点中声明,示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-3Tx9fBCP-1650958972745)(D:\A_study\Vue\vue3_study_image\c11.png)]

2. 触发自定义事件

在 emits 节点下声明的自定义事件,可以通过

this.$emit('自定义事件的名称')

方法进行触发,示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E4BTjs2b-1650958972746)(D:\A_study\Vue\vue3_study_image\c12.png)]

3. 监听自定义事件

在使用自定义的组件时,可以通过

v-on

的形式监听自定义事件。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uz61tMC6-1650958972746)(D:\A_study\Vue\vue3_study_image\c13.png)]

3.3 自定义事件传参

在调用

this.$emit()

方法触发自定义事件时,可以通过第 2 个参数为自定义事件传参,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UMqHQRAI-1650958972747)(D:\A_study\Vue\vue3_study_image\c14.png)]

4. 组件上的 v-model

4.1 为什么需要在组件上使用 v-model

v-model 是双向数据绑定指令,当需要维护组件内外数据的同步时,可以在组件上使用 v-model 指令。示意图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p0InPyiV-1650958972747)(D:\A_study\Vue\vue3_study_image\c15.png)]

  • 外界数据的变化会自动同步到 counter 组件中
  • counter 组件中数据的变化,也会自动同步到外界

4.2 在组件上使用 v-model 的步骤

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9iBY4z2a-1650958972747)(D:\A_study\Vue\vue3_study_image\c16.png)]

5. 总结

① 能够知道如何对 props 进行验证

  • 数组格式、对象格式
  • type、default、required、validator

② 能够知道如何使用计算属性

  • computed 节点、必须 return 一个结果、缓存计算结果

③ 能够知道如何为组件绑定自定义事件

  • v-on 绑定自定义事件、emits、$emit()

④ 能够知道如何在组件上使用 v-model

  • 应用场景:实现组件内外的数据同步
  • v-model:props名称、emits、$emit(‘update:props名称’)

组件高级(上)

1. watch 侦听器

1.1 什么是 watch 侦听器

watch 侦听器允许开发者监视数据的变化,从而针对数据的变化做特定的操作

例如,监视用户名的变化并发起请求,判断用户名是否可用。

1.2 watch 侦听器的基本语法

开发者需要在 watch 节点下,定义自己的侦听器。实例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bi1IsO45-1650958972748)(D:\A_study\Vue\vue3_study_image\d1.png)]

1.3 使用 watch 检测用户名是否可用

监听 username 值的变化,并使用 axios 发起 Ajax 请求,检测当前输入的用户名是否可用

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-H6xIPkgL-1650958972748)(D:\A_study\Vue\vue3_study_image\d2.png)]

1.4 immediate 选项

默认情况下,组件在初次加载完毕后不会调用 watch 侦听器。如果想让 watch 侦听器立即被调用,则需要使用 immediate 选项。实例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bd9Tlu2n-1650958972748)(D:\A_study\Vue\vue3_study_image\d3.png)]

1.5 deep 选项

当 watch 侦听的是一个对象,如果对象中的属性值发生了变化,则无法被监听到。此时需要使用 deep 选项,代码示例如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m4z4ymOF-1650958972749)(D:\A_study\Vue\vue3_study_image\d4.png)]

1.6 监听对象单个属性的变化

如果只想监听对象中单个属性的变化,则可以按照如下的方式定义 watch 侦听器:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XLwl3JnD-1650958972749)(D:\A_study\Vue\vue3_study_image\d5.png)]

1.7 计算属性 vs 侦听器

计算属性和侦听器侧重的应用场景不同

计算属性侧重于监听多个值的变化,最终计算并返回一个新值

侦听器侧重于监听单个数据的变化,最终执行特定的业务处理,不需要有任何返回值

2. 组件的生命周期

2.1 组件运行的过程

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zpxoGxXp-1650958972749)(D:\A_study\Vue\vue3_study_image\d6.png)]

组件的生命周期指的是:组件从创建 -> 运行(渲染) -> 销毁的整个过程,强调的是一个时间段。

2.2 如何监听组件的不同时刻

vue 框架为组件内置了不同时刻的生命周期函数,生命周期函数会伴随着组件的运行而自动调用。例如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0tzPYJkE-1650958972750)(D:\A_study\Vue\vue3_study_image\d6.png)]

① 当组件在内存中被创建完毕之后,会自动调用 created 函数

② 当组件被成功的渲染到页面上之后,会自动调用 mounted 函数

③ 当组件被销毁完毕之后,会自动调用 unmounted 函数

2.3 如何监听组件的更新

data 数据发生改变就触发 unpdated 声明周期函数

当组件的 data 数据更新之后,vue 会自动重新渲染组件的 DOM 结构,从而保证 View 视图展示的数据和Model 数据源保持一致。

当组件被重新渲染完毕之后,会自动调用 updated 生命周期函数。

2.4 组件中主要的生命周期函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HlkqwkYK-1650958972750)(D:\A_study\Vue\vue3_study_image\d7.png)]

注意:在实际开发中,created 是最常用的生命周期函数!

2.5 组件中全部的生命周期函数

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-loyFp9Pw-1650958972750)(D:\A_study\Vue\vue3_study_image\d8.png)]

2.6 完整的生命周期图示

可以参考 vue 官方文档给出的“生命周期图示”,进一步理解组件生命周期执行的过程:https://www.vue3js.cn/docs/zh/guide/instance.html#生命周期图示

3. 组件之间的数据共享

3.1 组件之间的关系

在项目开发中,组件之间的关系分为如下 3 种:

① 父子关系

② 兄弟关系

③ 后代关系

3.2 父子组件之间的数据共享

父子组件之间的数据共享又分为:

① 父 -> 子共享数据

② 子 -> 父共享数据

③ 父 <-> 子双向数据同步

1. 父组件向子组件共享数据

父组件通过 v-bind 属性绑定向子组件共享数据。同时,子组件需要使用 props 接收数据。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2Y3UiryU-1650958972750)(D:\A_study\Vue\vue3_study_image\d9.png)]

2. 子组件向父组件共享数据

子组件通过自定义事件的方式向父组件共享数据。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BFWa0FzE-1650958972751)(D:\A_study\Vue\vue3_study_image\d10.png)]

3. 父子组件之间数据的双向同步

父组件在使用子组件期间,可以使用 v-model 指令维护组件内外数据的双向同步:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-C7dd3Q7P-1650958972751)(D:\A_study\Vue\vue3_study_image\d11.png)]

3.3 兄弟组件之间的数据共享

兄弟组件之间实现数据共享的方案是 EventBus。可以借助于第三方的包 mitt 来创建 eventBus 对象,从而实现兄弟组件之间的数据共享。示意图如

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PajivIHW-1650958972751)(D:\A_study\Vue\vue3_study_image\d12.png)]

1. 安装 mitt 依赖包

在项目中运行如下的命令,安装 mitt 依赖包:

npm install [email protected]

2. 创建公共的 EventBus 模块

在项目中创建公共的 eventBus 模块如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2XEujZ5t-1650958972752)(D:\A_study\Vue\vue3_study_image\d13.png)]

3. 在数据接收方自定义事件

在数据接收方,调用

bus.on('事件名称', 事件处理函数)

方法注册一个自定义事件。示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-lzoup0K3-1650958972752)(D:\A_study\Vue\vue3_study_image\d14.png)]

4. 在数据接发送方触发事件

在数据发送方,调用

bus.emit('事件名称', 要发送的数据)

方法触发自定义事件。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4CmSAdFk-1650958972752)(D:\A_study\Vue\vue3_study_image\d15.png)]

3.4 后代关系组件之间的数据共享

后代关系组件之间共享数据,指的是父节点的组件向其子孙组件共享数据。此时组件之间的嵌套关系比较复杂,可以使用 provide 和 inject 实现后代关系组件之间的数据共享。

1. 父节点通过 provide 共享数据

父节点的组件可以通过 provide 方法,对其子孙组件共享数据:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CxXyCY6h-1650958972753)(D:\A_study\Vue\vue3_study_image\d16.png)]

2. 子孙节点通过 inject 接收数据

子孙节点可以使用 inject 数组,接收父级节点向下共享的数据。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PNw6IKeP-1650958972753)(D:\A_study\Vue\vue3_study_image\d17.png)]

3. 父节点对外共享响应式的数据

父节点使用 provide 向下共享数据时,可以结合 computed 函数向下共享响应式的数据。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-f25a9bUD-1650958972754)(D:\A_study\Vue\vue3_study_image\d18.png)]

4. 子孙节点使用响应式的数据

如果父级节点共享的是响应式的数据,则子孙节点必须以 .value 的形式进行使用。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-rkrZtn0r-1650958972754)(D:\A_study\Vue\vue3_study_image\d19.png)]

3.5 vuex

vuex 是终极的组件之间的数据共享方案。在企业级的 vue 项目开发中,vuex 可以让组件之间的数据共享变得高 效、清晰、且易于维护。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mU19O4dG-1650958972754)(D:\A_study\Vue\vue3_study_image\d20.png)]

3.6 总结

  • 父子关系

① 父 -> 子 属性绑定

② 子 -> 父 事件绑定

③ 父 <-> 子 组件上的 v-model

  • 兄弟关系

④ EventBus

  • 后代关系

⑤ provide & inject

  • 全局数据共享

⑥ vuex

4. vue 3.x 中全局配置 axios

4.1 为什么要全局配置 axios

在实际项目开发中,几乎每个组件中都会用到 axios 发起数据请求。此时会遇到如下两个问题:

① 每个组件中都需要导入 axios(代码臃肿)

② 每次发请求都需要填写完整的请求路径(不利于后期的维护)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jxq6eCmD-1650958972755)(D:\A_study\Vue\vue3_study_image\d21.png)]

4.2 如何全局配置 axios

在 main.js 入口文件中,通过 app.config.globalProperties 全局挂载 axios,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Sg6Kkg2U-1650958972755)(D:\A_study\Vue\vue3_study_image\d22.png)]

// main.js
import axios from 'axios'

const app = createApp(App)

axios.defaults.baseURL = 'https://www.escook.cn'
app.config.globalProperties.$http = axios

5. 总结

① 能够掌握 watch 侦听器的基本使用

  • 定义最基本的 watch 侦听器
  • immediate、 deep、监听对象中单个属性的变化

② 能够知道 vue 中常用的生命周期函数

  • 创建阶段、运行阶段、销毁阶段
  • created、mounted

③ 能够知道如何实现组件之间的数据共享

  • 父子组件、兄弟组件、后代组件

④ 能够知道如何在 vue3 的项目中全局配置 axios

  • main.js 入口文件中进行配置
  • app.config.globalProperties.$http = axios

组件高级下

1. ref 引用

1.1 什么是 ref 引用

ref 用来辅助开发者在不依赖于 jQuery 的情况下,获取 DOM 元素或组件的引用。

每个 vue 的组件实例上,都包含一个

$refs

对象,里面存储着对应的 DOM 元素或组件的引用。默认情况下,组件的

$refs

指向一个空对象。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dc8gbrV3-1650958972755)(D:\A_study\Vue\vue3_study_image\e1.png)]

1.2 使用 ref 引用 DOM 元素

如果想要使用 ref 引用页面上的 DOM 元素,则可以按照如下的方式进行操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IRhA5pgG-1650958972756)(D:\A_study\Vue\vue3_study_image\e2.png)]

1.3 使用 ref 引用组件实例

如果想要使用 ref 引用页面上的组件实例,则可以按照如下的方式进行操作:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-14u4dmlF-1650958972756)(D:\A_study\Vue\vue3_study_image\e3.png)]

1.4 控制文本框和按钮的按需切换

通过布尔值 inputVisible 来控制组件中的文本框与按钮的按需切换。示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bDM7Xyx2-1650958972756)(D:\A_study\Vue\vue3_study_image\e4.png)]

1.5 让文本框自动获得焦点

当文本框展示出来之后,如果希望它立即获得焦点,则可以为其添加 ref 引用,并调用原生 DOM 对象的.focus() 方法即可。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KVthsqFC-1650958972757)(D:\A_study\Vue\vue3_study_image\e5.png)]

1.6 this.$nextTick(cb) 方法

组件的

$nextTick(cb)

方法,会把 cb 回调推迟到下一个 DOM 更新周期之后执行。通俗的理解是:等组件的DOM 异步地重新渲染完成后,再执行 cb 回调函数。从而能保证 cb 回调函数可以操作到最新的 DOM 元素。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DsPmqtgA-1650958972757)(D:\A_study\Vue\vue3_study_image\e6.png)]

2. 动态组件

2.1 什么是动态组件

动态组件指的是动态切换组件的显示与隐藏。vue 提供了一个内置的 组件,专门用来实现组件

的动态渲染。

<component>

是组件的占位符

② 通过 is 属性动态指定要渲染的组件名称

<component is="要渲染的组件的名称"></component>

2.2 如何实现动态组件渲染

示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oyJRzluy-1650958972758)(D:\A_study\Vue\vue3_study_image\e7.png)]

2.3 使用 keep-alive 保持状态

默认情况下,切换动态组件时无法保持组件的状态。此时可以使用 vue 内置的

<keep-alive>

组件保持动态组件的状态。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-t94qdS0K-1650958972758)(D:\A_study\Vue\vue3_study_image\e8.png)]

3. 插槽

3.1 什么是插槽

插槽(Slot)是 vue 为组件的封装者提供的能力。允许开发者在封装组件时,把不确定的、希望由用户指定的部分定义为插槽

可以把插槽认为是组件封装期间,为用户预留的内容的占位符。

3.2 体验插槽的基础用法

在封装组件时,可以通过 元素定义插槽,从而为用户预留内容占位符。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4IVXdMWw-1650958972759)(D:\A_study\Vue\vue3_study_image\e9.png)]

1. 没有预留插槽的内容会被丢弃

如果在封装组件时没有预留任何 插槽,则用户提供的任何自定义内容都会被丢弃。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eSSxyXtt-1650958972759)(D:\A_study\Vue\vue3_study_image\e10.png)]

2. 后备内容

封装组件时,可以为预留的 插槽提供后备内容(默认内容)。如果组件的使用者没有为插槽提供任何内容,则后备内容会生效。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bsrLZRR3-1650958972760)(D:\A_study\Vue\vue3_study_image\e11.png)]

3.3 具名插槽

在一个 元素上使用 v-slot :Header指令,可以缩写成#Header

如果在封装组件时需要预留多个插槽节点,则需要为每个

<slot>

插槽指定具体的 name 名称。这种带有具体名称的插槽叫做“具名插槽”。示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SWTgj3Qr-1650958972760)(D:\A_study\Vue\vue3_study_image\e12.png)]

注意:没有指定 name 名称的插槽,会有隐含的名称叫做 “default”。

3.4 作用域插槽

在封装组件的过程中,可以为预留的

<slot>

插槽绑定 props 数据,这种带有 props 数据的

<slot>

叫做“作用域插槽”。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-jvO5rRhP-1650958972761)(D:\A_study\Vue\vue3_study_image\e13.png)]

1. 解构作用域插槽的 Prop

作用域插槽对外提供的数据对象,可以使用解构赋值简化数据的接收过程。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ICfgD4OJ-1650958972761)(D:\A_study\Vue\vue3_study_image\e14.png)]

2. 声明作用域插槽

在封装 MyTable 组件的过程中,可以通过作用域插槽把表格每一行的数据传递给组件的使用者。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eYGAcV90-1650958972762)(D:\A_study\Vue\vue3_study_image\e15.png)]

3. 使用作用域插槽

在使用 MyTable 组件时,自定义单元格的渲染方式,并接收作用域插槽对外提供的数据。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xQSvtzxt-1650958972762)(D:\A_study\Vue\vue3_study_image\e16.png)]

4. 自定义指令

声明自定义指令在 directives 节点下

4.1 什么是自定义指令

vue 官方提供了 v-for、v-model、v-if 等常用的内置指令。除此之外 vue 还允许开发者自定义指令。

vue 中的自定义指令分为两类,分别是:

  • 私有自定义指令
  • 全局自定义指令

4.2 声明私有自定义指令的语法

在每个 vue 组件中,可以在 directives 节点下声明私有自定义指令。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yc4qM4XA-1650958972763)(D:\A_study\Vue\vue3_study_image\e17.png)]

4.3 使用自定义指令

在使用自定义指令时,需要加上 v- 前缀。示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vphAqwYb-1650958972763)(D:\A_study\Vue\vue3_study_image\e18.png)]

4.4 声明全局自定义指令的语法

全局共享的自定义指令需要通过“单页面应用程序的实例对象”进行声明,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WaFJ3spt-1650958972763)(D:\A_study\Vue\vue3_study_image\e19.png)]

4.5 updated 函数

mounted 函数只在元素第一次插入 DOM 时被调用,当 DOM 更新时 mounted 函数不会被触发。 updated 函数会在每次 DOM 更新完成后被调用。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UwHpEQ2a-1650958972764)(D:\A_study\Vue\vue3_study_image\e20.png)]

注意:在 vue2 的项目中使用自定义指令时,【 mounted -> bind 】【 updated -> update 】

4.6 函数简写

如果 mounted 和updated 函数中的逻辑完全相同,则可以简写成如下格式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-siM5ixqF-1650958972764)(D:\A_study\Vue\vue3_study_image\e21.png)]

4.7 指令的参数值

在绑定指令时,可以通过“等号”的形式为指令绑定具体的参数值,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MLvvwNv4-1650958972765)(D:\A_study\Vue\vue3_study_image\e22.png)]

5. 总结

① 能够知道如何使用 ref 引用 DOM 和组件实例

  • 通过 ref 属性指定引用的名称、使用 this.$refs 访问引用实例

② 能够知道 $nextTick 的调用时机

  • 组件的 DOM 更新之后,才执行 $nextTick 中的回调

③ 能够说出 keep-alive 元素的作用

  • 保持动态组件的状态

④ 能够掌握插槽的基本用法

  • <slot> 标签、具名插槽、作用域插槽、v-slot: 简写为 #

⑤ 能够知道如何自定义指令

  • 私有自定义指令、全局自定义指令

路由

1. 前端路由的概念与原理

1.1 什么是路由

路由(英文:router)就是对应关系。路由分为两大类:

① 后端路由

② 前端路由

1.2 回顾:后端路由

后端路由指的是:请求方式请求地址function 处理函数之间的对应关系。在 node.js 课程中,express 路由的基本用法如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sGr5YNpp-1650958972765)(D:\A_study\Vue\vue3_study_image\f1.png)]

1.3 SPA 与前端路由

SPA 指的是一个 web 网站只有唯一的一个 HTML 页面,所有组件的展示与切换都在这唯一的一个页面内完成。此时,不同组件之间的切换需要通过前端路由来实现。

结论:在 SPA 项目中,不同功能之间的切换,要依赖于前端路由来完成!

1.4 什么是前端路由

通俗易懂的概念:Hash 地址组件之间的对应关系

1.5 前端路由的工作方式

① 用户点击了页面上的路由链接

② 导致了 URL 地址栏中的 Hash 值发生了变化

③ 前端路由监听了到 Hash 地址的变化

④ 前端路由把当前 Hash 地址对应的组件渲染都浏览器中

1.6 实现简易的前端路由

1. 步骤1

步骤1:导入并注册 MyHome、MyMovie、MyAbout 三个组件。示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-dXTTph3C-1650958972765)(D:\A_study\Vue\vue3_study_image\f2.png)]

2. 步骤2

步骤2:通过

<component>

标签的 is 属性,动态切换要显示的组件。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-w4HkIYCY-1650958972766)(D:\A_study\Vue\vue3_study_image\f3.png)]

3. 步骤3

步骤3:在组件的结构中声明如下 3 个 链接,通过点击不同的 链接,切换浏览器地址栏中的 Hash 值:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WFIUTYSL-1650958972766)(D:\A_study\Vue\vue3_study_image\f4.png)]

4. 步骤4

步骤4:在 created 生命周期函数中监听浏览器地址栏中 Hash 地址的变化,动态切换要展示的组件的名称:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-E59emDeo-1650958972766)(D:\A_study\Vue\vue3_study_image\f5.png)]

2. vue-router 的基本使用

2.1 什么是 vue-router

vue-router 是 vue.js 官方给出的路由解决方案。它只能结合 vue 项目进行使用,能够轻松的管理 SPA 项目中组件的切换

2.2 vue-router 的版本

vue-router 目前有 3.x 的版本和 4.x 的版本。其中:

  • vue-router 3.x 只能结合 vue2 进行使用
  • vue-router 4.x 只能结合 vue3 进行使用

vue-router 3.x 的官方文档地址:https://router.vuejs.org/zh/

vue-router 4.x 的官方文档地址:https://next.router.vuejs.org/

2.3 vue-router 4.x 的基本使用步骤

① 在项目中安装 vue-router

② 定义路由组件

③ 声明路由链接和占位符

④ 创建路由模块

⑤ 导入并挂载路由模块

1. 在项目中安装 vue-router

在 vue3 的项目中,只能安装并使用 vue-router 4.x。安装的命令如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kEbPO4QF-1650958972767)(D:\A_study\Vue\vue3_study_image\f6.png)]

2. 定义路由组件

在项目中定义 MyHome.vue、MyMovie.vue、MyAbout.vue 三个组件,将来要使用 vue-router 来控制它们的展示与切换:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ahpZoadj-1650958972767)(D:\A_study\Vue\vue3_study_image\f7.png)]

3. 声明路由链接和占位符

可以使用

<router-link>

标签来声明路由链接,并使用

<router-view>

标签来声明路由占位符。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YgYTyGhC-1650958972768)(D:\A_study\Vue\vue3_study_image\f8.png)]

4. 创建路由模块

在项目中创建 router.js 路由模块,在其中按照如下 4 个步骤创建并得到路由的实例对象:

① 从 vue-router 中按需导入两个方法

② 导入需要使用路由控制的组件

③ 创建路由实例对象

④ 向外共享路由实例对象

⑤ 在 main.js 中导入并挂载路由模块

2.4 从 vue-router 中按需导入两个方法

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SRFGWaDn-1650958972768)(D:\A_study\Vue\vue3_study_image\f9.png)]

2.5 导入需要使用路由控制的组件

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XYkd9KLx-1650958972768)(D:\A_study\Vue\vue3_study_image\f10.png)]

2.6 创建路由实例对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-UhxhV9Gp-1650958972769)(D:\A_study\Vue\vue3_study_image\f11.png)]

2.7 向外共享路由实例对象

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W9jhxd7w-1650958972769)(D:\A_study\Vue\vue3_study_image\f12.png)]

2.8 在 main.js 中导入并挂载路由模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-43G2rzuB-1650958972769)(D:\A_study\Vue\vue3_study_image\f13.png)]

3. vue-router 的高级用法

3.1 路由重定向

路由重定向指的是:用户在访问地址 A 的时候,强制用户跳转到地址 C ,从而展示特定的组件页面。通过路由规则的 redirect 属性,指定一个新的路由地址,可以很方便地设置路由的重定向:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vqlppz5M-1650958972770)(D:\A_study\Vue\vue3_study_image\f14.png)]

3.2 路由高亮

可以通过如下的两种方式,将激活的路由链接进行高亮显示:

① 使用默认的高亮 class 类

② 自定义路由高亮的 class 类

1. 默认的高亮 class 类

被激活的路由链接,默认会应用一个叫做 router-link-active 的类名。开发者可以使用此类名选择器,为激活的路由链接设置高亮的样式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JRXgk6ew-1650958972770)(D:\A_study\Vue\vue3_study_image\f15.png)]

2. 自定义路由高亮的 class 类

在创建路由的实例对象时,开发者可以基于 linkActiveClass 属性,自定义路由链接被激活时所应用的类名:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DMbkIaN4-1650958972770)(D:\A_study\Vue\vue3_study_image\f16.png)]

3.3 嵌套路由

通过路由实现组件的嵌套展示,叫做嵌套路由。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-WY27ZIGZ-1650958972771)(D:\A_study\Vue\vue3_study_image\f17.png)]

① 声明子路由链接和子路由占位符

② 在父路由规则中,通过 children 属性嵌套声明子路由规则

1. 声明子路由链接和子路由占位符

在 About.vue 组件中,声明 tab1 和 tab2 的子路由链接以及子路由占位符。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-PqiBpiCa-1650958972771)(D:\A_study\Vue\vue3_study_image\f18.png)]

2. 通过 children 属性声明子路由规则

注意:子路由规则的 path 不要以 / 开头!

在 router.js 路由模块中,导入需要的组件,并使用 children 属性声明子路由规则。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-svGfFsif-1650958972771)(D:\A_study\Vue\vue3_study_image\f19.png)]

3.4 动态路由匹配

1. 动态路由的概念

动态路由指的是:把 Hash 地址中可变的部分定义为参数项,从而提高路由规则的复用性。在 vue-router 中使用英文的冒号

:

来定义路由的参数项。示例代码如下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uwJHUmor-1650958972772)(D:\A_study\Vue\vue3_study_image\f20.png)]

2. $route.params 参数对象

通过动态路由匹配的方式渲染出来的组件中,可以使用 $route.params 对象访问到动态匹配的参数值。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bECEa3dO-1650958972772)(D:\A_study\Vue\vue3_study_image\f21.png)]

3. 使用 props 接收路由参数

为了简化路由参数的获取形式,vue-router 允许在路由规则中开启 props 传参。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-kZjEpXx0-1650958972772)(D:\A_study\Vue\vue3_study_image\f22.png)]

3.5 编程式导航

通过调用 API 实现导航的方式,叫做编程式导航。与之对应的,通过点击链接实现导航的方式,叫做声明式导航。例如:

  • 普通网页中点击 链接、vue 项目中点击 都属于声明式导航
  • 普通网页中调用 location.href 跳转到新页面的方式,属于编程式导航

1. vue-router 中的编程式导航 API

vue-router 提供了许多编程式导航的 API,其中最常用的两个 API 分别是:

① this.$router.push(‘hash 地址’)

  • 跳转到指定 Hash 地址,从而展示对应的组件

② this.$router.go(数值 n)

  • 实现导航历史的前进、后退

2. $router.push

调用 this.$router.push() 方法,可以跳转到指定的 hash 地址,从而展示对应的组件页面。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-j0bGmeVd-1650958972773)(D:\A_study\Vue\vue3_study_image\f23.png)]

2. $router.go

调用 this.$router.go() 方法,可以在浏览历史中进行前进和后退。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qyIG0lNw-1650958972773)(D:\A_study\Vue\vue3_study_image\f24.png)]

3.6 命名路由

注意:命名路由的 name 值不能重复,必须保证唯一性

通过 name 属性为路由规则定义名称的方式,叫做命名路由。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5gNd4t6q-1650958972773)(D:\A_study\Vue\vue3_study_image\f25.png)]

1. 使用命名路由实现声明式导航

<router-link>

标签动态绑定 to 属性的值,并通过 name 属性指定要跳转到的路由规则。期间还可以用params 属性指定跳转期间要携带的路由参数。示例代码 如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6DybnYC6-1650958972774)(D:\A_study\Vue\vue3_study_image\f26.png)]

2. 使用命名路由实现编程式导航

调用 push 函数期间指定一个配置对象,name 是要跳转到的路由规则、params 是携带的路由参数:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gnrwX8EA-1650958972774)(D:\A_study\Vue\vue3_study_image\f27.png)]

3.7 导航守卫

导航守卫可以控制路由的访问权限。示意图如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BZfDmspj-1650958972774)(D:\A_study\Vue\vue3_study_image\f28.png)]

1. 如何声明全局导航守卫

全局导航守卫会拦截每个路由规则,从而对每个路由进行访问权限的控制。可以按照如下的方式定义全局导航守卫:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ahye9v6S-1650958972775)(D:\A_study\Vue\vue3_study_image\f29.png)]

2. 守卫方法的 3 个形参

全局导航守卫的守卫方法中接收 3 个形参,格式为:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-AFgFPRSH-1650958972775)(D:\A_study\Vue\vue3_study_image\f30.png)]

注意:

① 在守卫方法中如果不声明 next 形参,则默认允许用户访问每一个路由!

② 在守卫方法中如果声明了 next 形参,则必须调用 next() 函数,否则不允许用户访问任何一个路由!

3. next 函数的 3 种调用方式

参考示意图,分析 next 函数的 3 种调用方式最终导致的结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SfyOVwC9-1650958972776)(D:\A_study\Vue\vue3_study_image\f31.png)]

直接放行:next()

强制其停留在当前页面:next(false)

强制其跳转到登录页面:next(‘/login’)

4. 结合 token 控制后台主页的访问权限

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fPbNd2zl-1650958972776)(D:\A_study\Vue\vue3_study_image\f32.png)]

4. 总结

① 能够知道如何在 vue 中配置路由

  • createRouter、app.use(router)

② 能够知道如何使用嵌套路由

  • 通过 children 属性进行路由嵌套、子路由的 hash 地址不要以 / 开头

③ 能够知道如何实现动态路由匹配

  • 使用冒号声明参数项、this.$route.params、props: true

④ 能够知道如何使用编程式导航

  • this.$router.pushthis.$router.go(-1)

⑤ 能够知道如何使用全局导航守卫

  • 路由实例.beforeEach((to, from, next) => { })

VUE 基础 - 综合案例

1. vue-cli

1.1 什么是 vue-cli

vue-cli(俗称:vue 脚手架)是 vue 官方提供的、快速生成 vue 工程化项目的工具。

特点:

① 开箱即用

② 基于 webpack

③ 功能丰富且易于扩展

④ 支持创建 vue2 和 vue3 的项目

vue-cli 的中文官网首页:https://cli.vuejs.org/zh/

1.2 安装 vue-cli

vue-cli 是基于 Node.js 开发出来的工具,因此需要使用 npm 将它安装为全局可用的工具:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2iAb1jrc-1650958972777)(D:\A_study\Vue\vue3_study_image\g1.png)]

1. 解决 Windows PowerShell 不识别 vue 命令的问题

默认情况下,在PowerShell 中执行 vue --version 命令会提示如下的错误消息:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Yj584ca4-1650958972777)(D:\A_study\Vue\vue3_study_image\g2.png)]

1.3 创建项目

vue-cli 提供了创建项目的两种方式:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tzKwinMA-1650958972777)(D:\A_study\Vue\vue3_study_image\g3.png)]

1.4 基于 vue ui 创建 vue 项目

1. 步骤1

在终端下运行 vue ui 命令,自动在浏览器中打开创建项目的可视化面板:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4STrv0AZ-1650958972778)(D:\A_study\Vue\vue3_study_image\g4.png)]

2. 步骤2

在详情页面填写项目名称:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-x0wHfY7H-1650958972778)(D:\A_study\Vue\vue3_study_image\g5.png)]

4. 步骤3

在预设页面选择手动配置项目:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-m9rvP8g1-1650958972778)(D:\A_study\Vue\vue3_study_image\g6.png)]

4. 步骤4

在功能页面勾选需要安装的功能(Choose Vue Version、Babel、CSS 预处理器、使用配置文件):

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oqIgz7Cx-1650958972779)(D:\A_study\Vue\vue3_study_image\g7.png)]

5. 步骤5

在配置页面勾选 vue 的版本和需要的预处理器:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Hgt8eN75-1650958972779)(D:\A_study\Vue\vue3_study_image\g8.png)]

6. 步骤6

将刚才所有的配置保存为预设(模板),方便下一次创建项目时直接复用之前的配置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-4FDvLIMG-1650958972780)(D:\A_study\Vue\vue3_study_image\g9.png)]

7. 步骤7

创建项目并自动安装依赖包:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qAkUTx7Y-1650958972780)(D:\A_study\Vue\vue3_study_image\g10.png)]

8. vue ui 的本质

通过可视化的面板采集到用户的配置信息后,在后台基于命令行的方式自动初始化项目:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e3zM6Emk-1650958972780)(D:\A_study\Vue\vue3_study_image\g11.png)]

9. 项目创建完成后,自动进入项目仪表盘

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-gmvROCTS-1650958972781)(D:\A_study\Vue\vue3_study_image\g12.png)]

1.5 基于命令行创建 vue 项目

步骤1:在终端下运行 vue create demo2 命令,基于交互式的命令行创建 vue 的项目:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Jy2CaR17-1650958972781)(D:\A_study\Vue\vue3_study_image\g13.png)]

步骤2:选择要安装的功能:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-FNNKGjvl-1650958972781)(D:\A_study\Vue\vue3_study_image\g14.png)]

步骤3:使用上下箭头选择 vue 的版本,并使用回车键确认选择:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KPPJcjGS-1650958972782)(D:\A_study\Vue\vue3_study_image\g15.png)]

步骤4:使用上下箭头选择要使用的 css 预处理器,并使用回车键确认选择:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hQ2J491Z-1650958972782)(D:\A_study\Vue\vue3_study_image\g16.png)]

步骤5:使用上下箭头选择如何存储插件的配置信息,并使用回车键确认选择:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ticpdF5P-1650958972782)(D:\A_study\Vue\vue3_study_image\g17.png)]

步骤6:是否将刚才的配置保存为预设:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DdZQvjxs-1650958972783)(D:\A_study\Vue\vue3_study_image\g18.png)]

步骤7:选择如何安装项目中的依赖包:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ofUxfLKW-1650958972783)(D:\A_study\Vue\vue3_study_image\g19.png)]

步骤8:开始创建项目并自动安装依赖包:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6p54hEaL-1650958972783)(D:\A_study\Vue\vue3_study_image\g20.png)]

步骤9:项目创建完成:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IVo3O5bi-1650958972784)(D:\A_study\Vue\vue3_study_image\g21.png)]

1.6 梳理 vue2 项目的基本结构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Vvg21lFc-1650958972784)(D:\A_study\Vue\vue3_study_image\g22.png)]

1.7 分析 main.js 中的主要代码

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Pn2dZK7f-1650958972784)(D:\A_study\Vue\vue3_study_image\g23.png)]

1.8 在 vue2 的项目中使用路由

在 vue2 的项目中,只能安装并使用 3.x 版本的 vue-router。

版本 3 和版本 4 的路由最主要的区别:创建路由模块的方式不同!

1. 回顾:4.x 版本的路由如何创建路由模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hY7D4ttC-1650958972785)(D:\A_study\Vue\vue3_study_image\g24.png)]

2. 学习:3.x 版本的路由如何创建路由模块

步骤1:在 vue2 的项目中安装 3.x 版本的路由:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-P0Gdsceo-1650958972785)(D:\A_study\Vue\vue3_study_image\g25.png)]

步骤2:在 src -> components 目录下,创建需要使用路由切换的组件:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NLT44iDE-1650958972785)(D:\A_study\Vue\vue3_study_image\g26.png)]

步骤3:在 src 目录下创建 router -> index.js 路由模块

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-s7SP354s-1650958972786)(D:\A_study\Vue\vue3_study_image\g27.png)]

步骤4:在 main.js 中导入路由模块,并通过 router 属性进行挂载

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iAkwXDSK-1650958972786)(D:\A_study\Vue\vue3_study_image\g28.png)]

步骤5:在 App.vue 根组件中,使用 声明路由的占位符:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-W7qb529i-1650958972787)(D:\A_study\Vue\vue3_study_image\g29.png)]

2. 组件库

2.1 什么是 vue 组件库

在实际开发中,前端开发者可以把自己封装的 .vue 组件整理、打包、并发布为 npm 的包,从而供其他人下载和使用。这种可以直接下载并在项目中使用的现成组件,就叫做 vue 组件库。

2.2 vue 组件库和 bootstrap 的区别

二者之间存在本质的区别:

  • bootstrap 只提供了纯粹的原材料( css 样式、HTML 结构以及 JS 特效),需要由开发者做进一步的组装和改造
  • vue 组件库是遵循 vue 语法、高度定制的现成组件,开箱即用

2.3 最常用的 vue 组件库

① PC 端

② 移动端

2.4 Element UI

Element UI 是饿了么前端团队开源的一套 PC 端 vue 组件库。支持在 vue2 和 vue3 的项目中使用:

1. 在 vue2 的项目中安装 element-ui

运行如下的终端命令

npm i element-ui -S

2. 引入 element-ui

开发者可以一次性完整引入所有的 element-ui 组件,或是根据需求,只按需引入用到的 element-ui 组件:

  • 完整引入:操作简单,但是会额外引入一些用不到的组件,导致项目体积过大
  • 按需引入:操作相对复杂一些,但是只会引入用到的组件,能起到优化项目体积的目的

3. 完整引入

在 main.js 中写入以下内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JAiHsbbM-1650958972787)(D:\A_study\Vue\vue3_study_image\g31.png)]

4. 按需引入

借助 babel-plugin-component,我们可以只引入需要的组件,以达到减小项目体积的目的。

步骤1,安装 babel-plugin-component:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-KuXNc92P-1650958972787)(D:\A_study\Vue\vue3_study_image\g32.png)]

步骤2,修改根目录下的 babel.config.js 配置文件,新增 plugins 节点如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IcsfSOFX-1650958972788)(D:\A_study\Vue\vue3_study_image\g33.png)]

步骤3,如果你只希望引入部分组件,比如 Button,那么需要在 main.js 中写入以下内容:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p9T4C8vM-1650958972788)(D:\A_study\Vue\vue3_study_image\g34.png)]

2.5 把组件的导入和注册封装为独立的模块

在 src 目录下新建 element-ui/index.js 模块,并声明如下的代码:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0bHXnQ8t-1650958972788)(D:\A_study\Vue\vue3_study_image\g35.png)]

3. axios 拦截器

3.1 回顾:在 vue3 的项目中全局配置 axios

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DAzTuC1c-1650958972789)(D:\A_study\Vue\vue3_study_image\g36.png)]

3.2 在 vue2 的项目中全局配置 axios

需要在 main.js 入口文件中,通过 Vue 构造函数的 prototype 原型对象全局配置 axios:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aGc2r6jV-1650958972789)(D:\A_study\Vue\vue3_study_image\g37.png)]

3.3 什么是拦截器

拦截器(英文:Interceptors)会在每次发起 ajax 请求和得到响应的时候自动被触发。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XKwZDwd7-1650958972789)(D:\A_study\Vue\vue3_study_image\g38.png)]

3.4 配置请求拦截器

通过 axios.interceptors.request.use(成功的回调, 失败的回调) 可以配置请求拦截器。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XCQejQEX-1650958972790)(D:\A_study\Vue\vue3_study_image\g39.png)]

注意:失败的回调函数可以被省略!

1. 请求拦截器 – Token 认证

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sMA5Or86-1650958972790)(D:\A_study\Vue\vue3_study_image\g40.png)]

2. 请求拦截器 – 展示 Loading 效果

借助于 element ui 提供的 Loading 效果组件(https://element.eleme.cn/#/zh-CN/component/loading)可以方便的实现 Loading 效果的展示:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9ODOTFHT-1650958972791)(D:\A_study\Vue\vue3_study_image\g41.png)]

3.5 配置响应拦截器

通过 axios.interceptors.response.use(成功的回调, 失败的回调) 可以配置响应拦截器。示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-l9u2k76b-1650958972791)(D:\A_study\Vue\vue3_study_image\g42.png)]

注意:失败的回调函数可以被省略!

1. 响应拦截器 – 关闭 Loading 效果

调用 Loading 实例提供的 close() 方法即可关闭 Loading 效果,示例代码如下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-REybLtIC-1650958972791)(D:\A_study\Vue\vue3_study_image\g43.png)]

4. proxy 跨域代理

4.1 回顾:接口的跨域问题

vue 项目运行的地址:http://localhost:8080/

API 接口运行的地址:https://www.escook.cn/api/users

由于当前的 API 接口没有开启 CORS 跨域资源共享,因此默认情况下,上面的接口无法请求成功!

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-InLkpW9k-1650958972792)(D:\A_study\Vue\vue3_study_image\g44.png)]

4.2 通过代理解决接口的跨域问题

通过 vue-cli 创建的项目在遇到接口跨域问题时,可以通过代理的方式来解决:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ESa5CEwR-1650958972792)(D:\A_study\Vue\vue3_study_image\g45.png)]

① 把 axios 的请求根路径设置为 vue 项目的运行地址(接口请求不再跨域)

② vue 项目发现请求的接口不存在,把请求转交给 proxy 代理

③ 代理把请求根路径替换为 devServer.proxy 属性的值,发起真正的数据请求

④ 代理把请求到的数据,转发给 axios

4.3 在项目中配置 proxy 代理

步骤1,在 main.js 入口文件中,把 axios 的请求根路径改造为当前 web 项目的根路径:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-cR7AiVkq-1650958972792)(D:\A_study\Vue\vue3_study_image\g46.png)]

步骤2,在项目根目录下创建 vue.config.js 的配置文件,并声明如下的配置:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-BTHBdvsM-1650958972793)(D:\A_study\Vue\vue3_study_image\g47.png)]

注意:

① devServer.proxy 提供的代理功能,仅在开发调试阶段生效

② 项目上线发布时,依旧需要 API 接口服务器开启 CORS 跨域资源共享

5. 总结

① 能够知道如何使用 vue-cli 创建项目

  • vue ui 、vue create 项目名称

② 能够知道如何在项目中安装和配置 element-ui

  • 完整引入、按需引入、参考官方文档进行配置

③ 能够知道 element-ui 中常见组件的用法

  • Table 表格、Form 表单、Dialog 对话框、Message 消息、MessageBox 弹框

④ 能够知道如何使用 axios 拦截器

  • axios.interceptors.request.use()、axios.interceptors.response.use()

⑤ 能够知道如何配置 proxy 代理

  • 修改请求根路径、vue.config.js、devServer.proxy

在 vue3 的项目中全局配置 axios

[外链图片转存中…(img-DAzTuC1c-1650958972789)]

3.2 在 vue2 的项目中全局配置 axios

需要在 main.js 入口文件中,通过 Vue 构造函数的 prototype 原型对象全局配置 axios:

[外链图片转存中…(img-aGc2r6jV-1650958972789)]

3.3 什么是拦截器

拦截器(英文:Interceptors)会在每次发起 ajax 请求和得到响应的时候自动被触发。

[外链图片转存中…(img-XKwZDwd7-1650958972789)]

3.4 配置请求拦截器

通过 axios.interceptors.request.use(成功的回调, 失败的回调) 可以配置请求拦截器。示例代码如下:

[外链图片转存中…(img-XCQejQEX-1650958972790)]

注意:失败的回调函数可以被省略!

1. 请求拦截器 – Token 认证

[外链图片转存中…(img-sMA5Or86-1650958972790)]

2. 请求拦截器 – 展示 Loading 效果

借助于 element ui 提供的 Loading 效果组件(https://element.eleme.cn/#/zh-CN/component/loading)可以方便的实现 Loading 效果的展示:

[外链图片转存中…(img-9ODOTFHT-1650958972791)]

3.5 配置响应拦截器

通过 axios.interceptors.response.use(成功的回调, 失败的回调) 可以配置响应拦截器。示例代码如下:

[外链图片转存中…(img-l9u2k76b-1650958972791)]

注意:失败的回调函数可以被省略!

1. 响应拦截器 – 关闭 Loading 效果

调用 Loading 实例提供的 close() 方法即可关闭 Loading 效果,示例代码如下:

[外链图片转存中…(img-REybLtIC-1650958972791)]

4. proxy 跨域代理

4.1 回顾:接口的跨域问题

vue 项目运行的地址:http://localhost:8080/

API 接口运行的地址:https://www.escook.cn/api/users

由于当前的 API 接口没有开启 CORS 跨域资源共享,因此默认情况下,上面的接口无法请求成功!

[外链图片转存中…(img-InLkpW9k-1650958972792)]

4.2 通过代理解决接口的跨域问题

通过 vue-cli 创建的项目在遇到接口跨域问题时,可以通过代理的方式来解决:

[外链图片转存中…(img-ESa5CEwR-1650958972792)]

① 把 axios 的请求根路径设置为 vue 项目的运行地址(接口请求不再跨域)

② vue 项目发现请求的接口不存在,把请求转交给 proxy 代理

③ 代理把请求根路径替换为 devServer.proxy 属性的值,发起真正的数据请求

④ 代理把请求到的数据,转发给 axios

4.3 在项目中配置 proxy 代理

步骤1,在 main.js 入口文件中,把 axios 的请求根路径改造为当前 web 项目的根路径:

[外链图片转存中…(img-cR7AiVkq-1650958972792)]

步骤2,在项目根目录下创建 vue.config.js 的配置文件,并声明如下的配置:

[外链图片转存中…(img-BTHBdvsM-1650958972793)]

注意:

① devServer.proxy 提供的代理功能,仅在开发调试阶段生效

② 项目上线发布时,依旧需要 API 接口服务器开启 CORS 跨域资源共享

5. 总结

① 能够知道如何使用 vue-cli 创建项目

  • vue ui 、vue create 项目名称

② 能够知道如何在项目中安装和配置 element-ui

  • 完整引入、按需引入、参考官方文档进行配置

③ 能够知道 element-ui 中常见组件的用法

  • Table 表格、Form 表单、Dialog 对话框、Message 消息、MessageBox 弹框

④ 能够知道如何使用 axios 拦截器

  • axios.interceptors.request.use()、axios.interceptors.response.use()

⑤ 能够知道如何配置 proxy 代理

  • 修改请求根路径、vue.config.js、devServer.proxy
标签: 前端 vue

本文转载自: https://blog.csdn.net/qq_53231262/article/details/124429457
版权归原作者 龙槑 所有, 如有侵权,请联系我们删除。

“vue3学习笔记”的评论:

还没有评论