【Vue】第五篇

Vue学习第五篇

  • [1. Vue引入第三方](#1. Vue引入第三方)
  • [2. Axios网路请求](#2. Axios网路请求)
    • [2.1 axios基本实现](#2.1 axios基本实现)
    • [2.2 Axios网络请求封装](#2.2 Axios网络请求封装)
    • [2.3 网络请求跨域解决方案](#2.3 网络请求跨域解决方案)
  • [3. Vue引入路由配置](#3. Vue引入路由配置)
    • [3.1 Vue引入路由基本实现](#3.1 Vue引入路由基本实现)
    • [3.2 路由传递参数](#3.2 路由传递参数)
    • [3.3 嵌套路由配置](#3.3 嵌套路由配置)
  • [4. Vue状态管理(Vuex)](#4. Vue状态管理(Vuex))
    • [4.1 Vuex基本实现](#4.1 Vuex基本实现)
    • [4.2 Vue状态管理核心(Vuex)](#4.2 Vue状态管理核心(Vuex))
  • [5. Vue3新特性](#5. Vue3新特性)
  • [6. Vue3加载Element-Plus](#6. Vue3加载Element-Plus)
    • [6.1 全局引入和按需引入](#6.1 全局引入和按需引入)
    • [6.2 引入Element-plus字体图标](#6.2 引入Element-plus字体图标)

1. Vue引入第三方

第三方:不属于Vue但是在Vue中能直接使用的,最常用的就是轮播图

故本节以轮播图为例。
一个优秀的框架,是否决定它优秀,也要看它的第三方是否足够多。
轮播图:

温馨提示:

在Vue中使用Swipper:

Swiper官方网址:https://swiper.com.cn
不止轮播图,还有很多好的第三方(Vue2官网有)

点击进入:

下面,我们来介绍轮播图的使用。

①安装

在vscode终端输入npm i --save swiper

②基本实现

实操:

效果:

③添加指示器

注意:Swiper 在v10及以上版本中,将导航、分页等模块的导出路径调整到了 swiper/modules 目录下,不再直接从 swiper 根目录导出。

html 复制代码
import { Pagination } from 'swiper/modules';

最终效果:

2. Axios网路请求

2.1 axios基本实现

Axios网络请求 是一个基于promise网络请求库

(1)安装

同样,它也是第三方,我们先进行安装。

vscode终端输入npm i --save axios

(2)引入

①组件中引入---get版

html 复制代码
<script>
import axios from 'axios'

export default {
  name: 'HelloWorld',
  mounted() {
    axios({
      method: "get",
      url:
        "http://iwenwiki.com/api/blueberrypai/getChengpinDetails.php"
    }).then(res => {
      console.log(res.data);
    })
  }
}
</script>

讲解:

mounted 是Vue的生命周期钩子函数,当组件的DOM元素被渲染到页面上后,会自动执行中国函数里的代码。通常会在mounted中发送请求,因为此时组件已经"准备就绪",可以操作DOM或处理数据了。

(created也可以,但此时还不可操作DOM)

method 写请求方式,url 写请求的接口地址

③因axios是基于promise实现,所以用.then ()来处理"请求成功"的情况(如果请求成功,则执行这里的代码)

res 是接口返回的"响应对象"。

效果:

在页面中显示数据

我们先来看接口数据的格式:

实操:

页面效果

②组件中引入---post版

代码

html 复制代码
    //post请求方式
    axios({
      method: "post",
      // 提交登录信息(提交数据)
      url:
        "http://iwenwiki.com/api/blueberrypai/login.php",
      data: {
        user_id: "iwen@qq.com",
        password: "iwen123",
        verification_code: "crfvw"
      }
    }).then(res => {
      console.log(res.data);
    })

但是拿到的数据是不对的

因为网络请求接收参数的类型,并不是对象类型,而是字符串类型,所以要将data的数据类型转为字符串类型

在vscode终端输入npm i --save querystring

实操:

效果:

③快捷方案

接下来来讲全局引入

①先在main.js 中导入axios,创建app实例并挂载Axios

②在Vue组件中使用

2.2 Axios网络请求封装

在日常应用过程中,一个项目中的网络请求会很多,此时一般采取的方案是将网络请求封装起来
src下创建utils 文件夹,在其之下创建request.js
我们先导入axios ,创建一个instance实例对象,最后导出。

通过axios的create方法 创建一个自己的网络请求对象

其中,拦截器 是最常用的。

我们在发送网络请求之前获取 到网络请求给我们返回的数据之前

都可以需要把这个请求给拦截一下, 一些额外的处理
interceptors:拦截器对象

request:发送

use:方法

instance.interceptors.request.use 处理拦截器

function:需要有成功的函数、失败的函数

补充:js的对象解构赋值
const response = error.response;

// 传统方式:通过 . 语法获取

而使用解构赋值,写法更简洁
const { response } = error;

// 解构赋值:直接从 error 中提取 response 属性

html 复制代码
const errorHandle = (status, info) => {
  switch (status) {
    case 400:
      console.log("语义有误");
      break;
    case 401:
      console.log("服务器认证失败");
      break;
    case 403:
      console.log("服务器拒绝访问");
      break;
    case 404:
      console.log("地址错误");
      break;
    case 500:
      console.log("服务器遇到意外");
      break;
    case 502:
      console.log("服务器无响应");
      break;
    default:
      console.log(info);
      break;
  }
}

errorHandle函数 包含sitch对于各种状态码的监听

用于传递状态码信息status、具体错误信息info
注意:学习时,网站axios看云的文档比较清晰
封装结束之后,就可以直接使用了。

但是使用方式不像我们之前那样直接在组件中写。
①创建一个api文件夹,创建两个文件,
path.js /base.js以及index.js

(utils内的request.js只是网络请求的方法
path.js统一管理接口地址,让代码更整洁、更容易维护

若接口地址改变,只改 path.js 里的配置,不改组件。
index.js定义具体接口的请求方法,简化组件代码

组件里不用关心接口 URL 是什么,只需要调用 如api.getChengpin() 这个方法就行。
utils/request.js写统一调用一个网络请求的解决方案

api/path.js写众多路径,

api/index.js写众多的网络请求方法,都可以放在一个文件里面。
实现逻辑分离:把 "怎么发请求"(utils/request.js)、"请求哪里"(api/path.js)、"具体哪个接口"(api/index.js)拆分开,代码更清晰。
utils/request.js 是 "网络请求的方法",因为它的核心作用是封装网络请求的逻辑和工具函数 ,提供了一套可复用的 "方法" 来处理前端与服务器的通信,本质是对 axios 的 "方法封装" (基于axios二次封装)

它规定了网络请求的 "规则和方式"------ 比如用什么工具发请求、请求格式是什么、遇到错误怎么处理等,相当于给 "发请求" 这件事定了一套标准流程。

②path.js内创建base变量 (定义一个配置对象)
把所有的路径都写入,并导出对象base

baseUrl:公共路径

chengpin:具体接口的路径

请求诚品数据

它们两个一拼就是完整地址,为何要分开呢?

因为 baseUrl是所有接口的公共前缀(基础域名)。
③index.js 引入axios、path.js

在里面定义一个api对象,并导出api对象

定义具体接口获取网络请求的方法

④组件中使用

2.3 网络请求跨域解决方案

"网络请求跨域" 是浏览器 的一种安全限制机制(称为 "同源策略")导致的现象

简单说:当一个网页面对另一个不同 "源" 的服务器发送请求时,浏览器会阻止这个请求,这就是跨域。


如下图所示

解决方案(我们主要针对前台处理)

实操①:

写入协议、域名、(端口,默认可不写)
实操②:Vue组件中,删除前面的公共前缀(处理过的)

3. Vue引入路由配置

3.1 Vue引入路由基本实现

路由的作用:管理页面之间的关系,如页面间的跳转

(以前使用href标签进行跳转)
传统href是 "多页应用" 的跳转方式,通过重新加载页面实现跳转,体验和性能较差。

前端路由是 "单页应用" 的核心,通过切换组件实现无刷新跳转,解决了href的痛点,支持复杂交互和状态管理。


如果创建项目的时候,选中Router,则会集成该功能在里面。

vue-router文档学习入口

①安装

配置独立的路由文件

创建router文件夹 ,下设index.js文件

导入创建路由的两个核心工具,创建路由实例对象

创建两个页面,引入到index.js 当中。

定义路由规则创建一个数组 ,来承载两个页面的配置 ,

每个配置是个对象类型

path:希望通过什么样的路径去访问它

component:对应的组件
配置数组 需要扔到路由的对象当中以及history访问方式

然后导出对象router

引入路由到项目中

在主入口文件main.js引入


指定路由显示出口

App.vue中写上路由的显示出口router-view

指定路由跳转

这里是在App.vue中写

实操:

效果:

点击首页,路由跳转到/,显示首页

点击关于,路由跳转到about,显示关于页面

跳转时不会刷新整个页面,只会替换页面中router-view标签的内容(这就是单页应用的无刷新体验)
补充说明

路由模式
createWebHistory基于HTML5的history.pushState()API实现。当用户通过前端导航(如点击按钮)跳转时,路由会通过pushState()修改URL,并手动渲染对应组件,不会向服务器发送请求,因此不会有问题。

但当用户直接在浏览器地址栏输入网址并回车,或刷新页面,浏览器会认为这是一个新的页面请求,会直接向服务器发送请求,如果后端没有配置/about这个路径的处理规则,则会默认返回404错误。(因为后端根本没有about.html这个文件)

实际上,我们需要服务器无论收到说明路径的请求,都返回单页应用的入口文件index.html,让前端路由接手处理URL并渲染对应组件。
后端重定向的作用:将所有前端路由路径的请求都重定向到index.html


3.2 路由传递参数

跳转的是同一个页面 ,怎么让它显示不同的数据

------根据某一个参数 来进行处理

创建一个新闻页面,引入路由参数配置 ,App.Vue上显示

补充:异步加载方式:如果这个页面没有被显示出来,这个代码是不会被执行的
如果我们把所有的页面都在顶部引入进来了,

那么这个组件不管有没有被引用,都会被加载引入进来,

这样一来,如果页面多内容多则容易造成卡顿。

所以说我们一般除了首页会在这顶部直接引入之外,

剩下的页面都会使用异步加载方式引入。

这可以让首页的加载速度更快一些。

(有很多项目对于首页的加载速度是有要求的,

比如,百度的搜索引擎)

接下来,进入正文

在路由配置中指定参数的key

这里指定key为name

在跳转过程在携带参数


在详情页面读取路由携带的参数

3.3 嵌套路由配置

有两个导航

①创建子路由要加载显示的页面

②在路由配置文件中添加子路由配置

③指定子路由显示位置

效果:


④添加子路由跳转链接

效果



但是一般都是默认显示第一个

(即点击About,显示其子组件内容,

并默认显示关于我们的内容)
⑤重定向

4. Vue状态管理(Vuex)

4.1 Vuex基本实现

状态管理,可以简单理解为,组件与组件之间的数据管理

简言之,集中式管理 ,任何组件都可以按照指定的方式进行读取和改变数据

从前只能父子之间通信

①安装

同理,也可以像路由一样直接导入

手动配置则如下图所示:

可查阅官方文档

②配置Vuex文件

创建新文件夹store,在其之下创建index.js文件

在index.js文件内写入如下内容:



③在主文件中引入Vuex

④在组件中读取状态

4.2 Vue状态管理核心(Vuex)

Vuex最重要的点------可以对这些数据 进行同步地修改

即组件遵循一种规则,然后按这种规则去修改Vuex中的数据,其他组件都可以同时得到响应。

补充:内层是HelloWorld,vue,外层是App.vue

①Getter

对Vuex中的数据进行过滤 :对读取的方式提供一种更合理的方式。

state里的数据 可能不是页面想要 ,所以增加getters对数据进行过滤。

Getters内定义方法对数据进行处理。

过滤后读取:

法一:

法二:

(p标签要写上)

结果是显示:count=数据异常
Vuex不仅可以读取数据,还可以修改数据。
使用②Mutation 更改数据:

定义方法来进行数据修改,默认state为第一个参数。
实操:通过Mutation里的方法来更改Vuex中的数据

组件中调用

效果

点击增加后:

还有个优势就是,任何对count所引用的组件,都会得到相应的变化
在About页面组件也显示count

(用getters是因为需要处理后的数据,正常state也可)
实操

主页面增加到count=6:

about页面 的count也一样到6了:
还可以传递参数


效果

点击添加后

当然,这种方式调用起来比较麻烦,Vuex还提供了一种快捷方案:

实操

点击增加按钮后,

③Action,可异步

Action和Mutation是一个意思,但不同的是Mutation内只允许同步操作,不允许异步操作。

提交数据,Action也是把数据提交给Mutation,Mutation再去更改
外部调用asyncAddCounter方法而不再是addCounter

数据来源于网路请求,也不再来源于页面中自己传递。

补充知识点:对象解构赋值

// 解构赋值的过程等价于:
const commit = context.commit;

页面调用补充知识点:

效果:

查看后端API接口

前端页面显示:本来是1,点击异步增加变为1011

同样,它也有快捷方案

5. Vue3新特性

Vue2到Vue3,是版本的升级。

相当于微信5.0到6.0

Vue3的六大亮点

Vue的底层源码,以前是用JS写的,现在改成了TS。
新特性1:ref和reactive
新特性2:setup ,方法与变量写入其中(data和methods)

以前是拿取data的数据,现在是直接在setup中声明,且使用的是ref和reactive

日后在setup中所声明的变量,外部想访问,都必须return

效果:

一般我们用reactive 声明对象类型的数据,

或者复杂数据类型的数据

修改:定义一个方法修改

效果:

按下按钮后

新特性3:props 组件传递数据,context 是当前对象

实操:

子组件,setup接收数据(props要定义)

console.log(props.msg)则打印"数据"
setup中没有this关键字,

如果想获取当前实例对象,使用ctx,即context

控制台:

emit自定义事件

attrs属性

slots插槽
新特性4:setup中使用生命周期函数


实操:

优势:同一个生命周期函数可以存在多个。

为什么是优势?

因为生命周期的使用频率很高,日后很多业务都会放在这个生命周期函数当中。

如果把特别多的业务都放在同一个内,后续整理起来会比较乱。

但是如果是一个函数放一个业务,拆分多个业务便会很清晰。

新特性5:Provide/Inject

关于组件间的数据传递。

下文的,Vue2也有,只是Vue2的时候很少有人用。

Vue3时候,这个东西得到了增强,所以Vue3的使用率高一些。


实操

必须由上至下

中间再多几层组件也可。

Provide/Inject:跨任意层级传递 , 可以实现祖先组件 → 任意深层后代组件 的数据传递,无需中间层组件转发。

祖先组件用 provide 提供数据,任意后代组件用 inject 接收,直接跳过中间层。

Provide/Inject 的传递关系是隐式的:祖先组件提供数据时,不需要知道哪些后代会使用;后代组件接收时,也不需要知道数据来自哪个祖先,只能通过约定的key关联。
新特性6:Fragment

实操

6. Vue3加载Element-Plus

6.1 全局引入和按需引入

Element组件库针对Vue2,Element-Plus组件库针对Vue3

①安装

②全局引入

实操:

③使用

复制element-plus的组件代码

实操1:按钮

效果:

实操2:switch开关按钮

实操:

注意,它的语法是用TS写的,我们需要把它改为JS

如下:

效果:

所有组件安装官方文档方式复制使用即可。
④按需引入

复制下来,并写到vite.config.js中

最后一步,同全局引入

6.2 引入Element-plus字体图标

字体图标需要额外安装
①安装

②全局注册

③引入

④使用

相关推荐
崔庆才丨静觅5 小时前
hCaptcha 验证码图像识别 API 对接教程
前端
passerby60615 小时前
完成前端时间处理的另一块版图
前端·github·web components
掘了6 小时前
「2025 年终总结」在所有失去的人中,我最怀念我自己
前端·后端·年终总结
崔庆才丨静觅6 小时前
实用免费的 Short URL 短链接 API 对接说明
前端
崔庆才丨静觅6 小时前
5分钟快速搭建 AI 平台并用它赚钱!
前端
崔庆才丨静觅6 小时前
比官方便宜一半以上!Midjourney API 申请及使用
前端
Moment6 小时前
富文本编辑器在 AI 时代为什么这么受欢迎
前端·javascript·后端
崔庆才丨静觅7 小时前
刷屏全网的“nano-banana”API接入指南!0.1元/张量产高清创意图,开发者必藏
前端
剪刀石头布啊7 小时前
jwt介绍
前端
爱敲代码的小鱼7 小时前
AJAX(异步交互的技术来实现从服务端中获取数据):
前端·javascript·ajax