一天搞定Vue3——包含Axios、ElementUI Plus、Vuex的使用!!!

news2024/11/25 14:47:54

    前言,本篇文章是依据bilibili博主(波波酱老师)的学习笔记,波波酱老师讲的很好,很适合速成!!!
在这里插入图片描述

    本篇文章会与vue2进行对比学习,并且也有很多的JavaScript知识点,要提前掌握他们才能学的效果更佳,见效更快。🥳

文章目录

  • Vue基础
    • Vue的底层原理
    • el挂载点
    • data数据对象
    • methods方法
  • 指令
    • v-text
    • v-html
    • v-on
    • v-show
    • v-if
    • v-bind
    • v-for
    • v-model
      • 其他指令
      • 自定义指令
  • 事件和属性
    • 事件修饰符
    • 计算属性
    • 侦听属性
      • 深度侦听
      • 过滤属性
  • 生命周期函数
  • 组件
    • 组件创建和使用
    • 全局组件
    • 父子组件
    • 单文件组件
      • 组件通信
      • 子组件向父组件传递数据
      • 全局事件总线
      • 企业级开发组件结构
    • 脚手架搭建
      • 脚手架目录结构
      • render函数
  • 路由
    • 自定义插件
    • 路由使用
    • 深度路由
    • 多级路由
      • 组件的数据传递
    • 编程式路由导航
    • 路由守卫
      • 全局路由守卫
      • 独享路由守卫和组内路由守卫
  • axios
    • 全局安装JSON server
      • get请求快速入门
      • 提交请求
        • 实现增加功能
        • 实现删除功能
      • 异常处理方式
      • 响应对象结构分析
    • axios默认配置
  • EL组件库使用
    • EL组件导入
  • 布局组件
    • Layout布局
    • Container布局容器
    • Button按钮
      • 普通按钮
      • 朴素按钮
      • 圆角按钮
      • 图片按钮
      • 按钮组
  • 表单组件
    • 单选框
    • 复选框
    • input文本框
    • 下拉框
    • 日期和时间
    • 文件上传
  • Vue3
    • Vue3的项目初始化
      • 如何初始化Vue3项目
      • 目录结构
      • Vue2和Vue3的区别
    • 组合式API
      • setup函数
    • 响应式函数
      • reactive
      • ref
        • 对象类型
        • 简单类型
        • 数组类型
    • 属性
      • 计算属性
        • get和set写法
      • 侦听属性
        • 对象类型侦听
        • 精确侦听
    • 生命周期函数
    • 组件通信
      • 父传子通信
      • 子传父通信
        • 模版引用ref
        • 事件总线
  • Vuex
    • 创建Vuex项目
      • 创建store对象
        • 实现actions、mutations和state

Vue基础

Vue的底层原理

MVVN模型

  • M:模型(model):对应的data中的数据
  • V:视图(View):模版
  • VM:视图模型(ViewModel):Vue事例对象

MVVM数据监视与代理

image-20240619193709170

el挂载点

  • vue实例的作用范围是el选项命中的元素及其内部的后代元素
  • 可以使用其他的选择器,建议使用id选择器
  • 可以使用在其他双标签中,但是要注意不能使用在html标签body标签
<script>
    
	var app = new Vue({
        el:"#app",	//id选择器
        el:".app",	//class选择器
        el::"div",	//标签选择器
    	data:{
    		message:"el挂载点"
    	}
    })
</script>

data数据对象

  • vue中用到的数据定义在data
  • data中可以写复杂类型的数据
  • 渲染复杂类型数据时,应当遵守JS语法
<div id="app">
    {{message}}
    {{preson.name}}{{preson.age}}
    <ul>
        <li {{city[0]}}></li>
        <li {{city[1]}}></li>
        <li {{city[2]}}></li>
        <li {{city[3]}}></li>
    </ul>
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
    		message:"data数据对象",
        }
            person:{	//对象属性
            	name:"天下无贼"
            	age:"188"
        	},
        	city:["北京","上海","广州","深圳"]	数组属性
    	}
    })
</script>

methods方法

image-20240619194051903

不要写尖头函数,因为会改变this指向

image-20240619194121262

指令

v-text

  • 设置标签的文本值内容
  • 默认写法会替换全部内容,使用插值表达式{{}}就是他的简写形式
  • 内部支持写表达式
<div id="app">
    <h2 v-text="message"></h2>	<!--输出的是"v-text属性"-->
    <h2 v-text="message">我会被覆盖</h2>	<!--这个输出的也是"v-text属性",没有"aaa"的原因是因为v-text覆盖掉了-->
    
    <h2 v-text="message+'!!!'"></h2>	<!--支持字符串拼接表达式-->
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
    		message:"v-text属性",
            aaa:"aaa"
        },
    })
</script>

v-html

  • 设置标签的html对象
  • 内容中有html结构会被解析成标签
  • 解析文本的时候使用v-text,需要解析html结构的时候使用v-html
<div id="app">
        <p v-html="message"></p>
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
    		message:" <a herf="www.baidu.com">v-html</a> "
        },
    })
</script>

v-on

  • 为元素绑定事件
  • 绑定的方法定义在methods属性当中
  • 方法的内部通过this关键字可以访问定义在data中的数据
<div id="app">
    <p>
        {{message}}
    </p>
    <button v-on:click="do">v-on触发</button>
    <button @click="do">v-on简写触发</button>	<!--简写形式-->
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
        	message="你好"
        },
        methods:{
            do:function(){
                //方法逻辑
                this.message+="我不好"	//使用[this.]关键字拿到当前对象
            }
        }
    })
</script>

v-on简写可以为@

传递自定义参数,事件修饰符

<div id="app">
	<button @click="do(p1,'你好')"></button>
    <button @keyup.enter="do2"></button>
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
        },
        methods:{
            do:function(p1,p2){
				console.log("v-on自定义参数"+p1+p2);
            },
            do2:function(){
            	console.log("键盘enter键事件修饰符");
        	}
        }
    })
</script>

写一个计数器小案例

<div id="app">
    <button @:click="sub">-</button>
    <span>{{message}}</span>
    <button @click="add">+</button>
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
        	message:0
        },
        methods:{
            add:function(){
                if(this.message<10){
                    this.message++;
                }else{
                    alert("别点啦最大了!!!")
                }
            },
            sub:funct(){
 				if(this.message>0){
                    this.message--;
                }else{
                    alert("别点啦最小了!!!")
                }
            }
        }
    })
</script>

v-show

  • 根据后面表达式的真假来决定元素的显示隐藏
  • 原理是修改了元素的display来实现隐藏
  • 指令后面的内容,最终都会被解析成布尔值
  • 值为true元素显示,值为false元素隐藏
<div id="app">
	<P v-show="true">通过设置布尔值来决定v-show</P>
    <P v-show="isShow">通过isShow来决定</P>
    <button @click="do">改变isShow值</button>
    <P v-show="age>=18">通过元素值来决定</P>
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
        	age:17,
            isShow:false
        },
        methods:{
            do:function(){
                this.isShow =!this.isShow;
            }
        }
    })
</script>

v-if

  • 根据表达式的增加切换元素的显示状态
  • 本质上是操作Dom元素来切合显示状态
  • 频繁的切换v-show因为消耗的性能较小,但是占用内存较高.反之使用v-if
<div id="app">
	<P v-if="isShow">这个是v-if的案例</P>
    <button @click="do">改变isShow值</button>
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
            isShow:true
        },
        methods:{
            do:function(){
                this.isShow =!this.isShow;
            }
        }
    })
</script>

v-bind

  • 为元素绑定属性
  • 语法模板v-bind:属性名=表达式
  • 简写形式直接:属性名

image-20240619192029170

<div id="app">
    <a v-bind:href="message">点我以下</a>

    <button @click="do">改变isShow值</button>
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
            message:"www.baidu.com",
        }
    })
</script>

v-for

  • 根据数据生成列表结构
  • 语法模板v-for="(item,index)in 数据"(item代表每一项,index是索引)
<div id="app">
	<ul>
        <li v-for="item in arr">v-for案例:{{item}}</li>
    </ul>
    
        <h2 v-for="(item,ixdex) in arr">{{"index":index}}{{item.name}}</h2>
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
			arr:[1,2,3,4,5],
            obj:[
                {name:"aaa"},
                {name:"bbb"}
            ]	//对象数组
        }
    })
</script>

v-model

  • 获取和设置表单元素的值(双向数据绑定)
  • 绑定的数据会和表单元素值相关联
  • 绑定的数据和表单元素的值是双向绑定
<div id="app">
    <input type="text" v-model="message">
    <h2>
        {{message}}
    </h2>
</div>
<script>
	var app = new Vue({
        el:"#app",
    	data:{
            message:"v-model"
        },
        methods:{
        }
    })
</script>

其他指令

image-20240619201900666

自定义指令

image-20240619202454927

简写形式

image-20240619202720082

需要在学习一下

事件和属性

事件参数e

e获得当前元素

image-20240619194413344

带参数$event

image-20240619194449537

事件修饰符

image-20240619194840377

计算属性

computed计算属性

image-20240619195312060

image-20240619195329828属性调用不需要()

侦听属性

watch侦听属性

image-20240619195613836

简化写法:

image-20240619195746318

深度侦听

deep深度侦听属性

image-20240619200229085

image-20240619200220494

侦听器与计算属性对比

过滤属性

filters过滤属性

image-20240619200756268

生命周期函数

image-20240619203201230

组件

组件创建和使用

首先在脚本区域声明一个组件

image-20240620094016325

Vue.entend() 可以省略

image-20240620094306636

注册组件

image-20240620094230641

使用组件
image-20240620094134052

关于组件的命名

  • SchoolMes【需要脚手架】,回避HTML关键字
  • 建议组件声明时定义name属性
  • Vue工具最终都会将组件命名变成“首字母大写”

声明的时候就把名字声明好了

image-20240620094559412

image-20240620094616419

全局组件

第一个参数是组件的名称,第二个参数是配置组件项。

image-20240620094939171

第二行的name也可以删掉

父子组件

创建子组件:要在父组件中注册子组件

image-20240620095435278

注意需要先声明子组件,把子组件放前面,让他先加载

使用子组件与使用组件方法一样

单文件组件

在IDEA中配置vue文件

image-20240620095732893

新建vue文件的结构

image-20240620095834084

父组件自动导入

image-20240620100137730

组件通信

image-20240620102916784

image-20240620103313732

加上绑定就变成数值,而不是字符串了

image-20240620103426926

子组件向父组件传递数据

第一种方式:通过props

image-20240620110721897

第二种方法:通过$emit

image-20240620111433592

第三种方法:$on挂载事件和$emit调用

image-20240620112005694

全局事件总线

实现任意组件传递数据

image-20240620112237084

image-20240620112425974

main.js创建事件总线

image-20240620112458662

image-20240620112720707

image-20240620112729562

建议使用完总线后消亡该总线image-20240620112818566

企业级开发组件结构

  • 总组件App.vue

    要有一个顶级结构image-20240620100522995

  • vm事例对象main.js

    image-20240620100801793

  • 容器index.html

    image-20240620101031420

脚手架搭建

搭建脚手架命令

image-20240620101139705

  1. 配置node
  2. 配置淘宝镜像
  3. 全局安装vue脚手架
  4. 创建项目
  5. 启动项目

脚手架目录结构

修改配置项目

image-20240620102416984

lintOnSave:false取消因为命名不规范而报错

image-20240620102349727

render函数

image-20240620102823586

路由

自定义插件

创建插件,在src文件包下创建一个js文件

使用插件,在main.js文件中,

image-20240620113139802

路由使用

image-20240620113551014

第一步安装路由

第二步安装路由插件

  • ​ 创建一个新的文件夹来当作我们的路由

image-20240620114008513

第三步路由的使用

image-20240620114125849

第四步使用路由规则

深度路由

image-20240620114533209

image-20240620115023919

多级路由

组件的数据传递

image-20240620115339108

编程式路由导航

image-20240620115627069

路由守卫

全局路由守卫

image-20240620115730195

独享路由守卫和组内路由守卫

image-20240620115806286

axios

  • 首先导入axios
    axios.get(地址?查询字符串).then(funciton(response){},function(err){ })
  • 使用get和post方法即可发送对应的请求
  • then方法中的回调函数会在请求成功或失败时候触发
  • 通过回调函数的形参可以获取响应内容或者错误信息

全局安装JSON server

image-20240619203815033

get请求快速入门

image-20240619204328168

简化写法

image-20240619204521834

改造

image-20240619211422645

提交请求

实现增加功能

image-20240619210618978

async改造

image-20240619211509396

实现删除功能

image-20240619211201687

改造

image-20240619211633178

异常处理方式

image-20240619204800099

简写形式

image-20240619204852554

响应对象结构分析

image-20240619205228317

axios默认配置

image-20240619205501344省略这些

image-20240619205524955

EL组件库使用

EL组件导入

布局组件

Layout布局

image-20240620144100810

image-20240620144030458

Container布局容器

image-20240620144158054

image-20240620144401978

垂直布局和水平布局

Button按钮

image-20240620144627784

普通按钮

image-20240620144819742

image-20240620144827804

朴素按钮

image-20240620144849133

image-20240620144904066

圆角按钮

image-20240620144918610

image-20240620144925727

图片按钮

image-20240620144945025

image-20240620145004556

因为加了一个circle所以是圆形按钮,下面是去掉

image-20240620145045213

按钮组

image-20240620145114061

image-20240620145132120

表单组件

单选框

image-20240620145226547

image-20240620145406165

image-20240620145421305

image-20240620145441270

image-20240620145506890

image-20240620145520963

image-20240620145542035

image-20240620145629122

image-20240620145633401

复选框

image-20240620145704977

input文本框

下拉框

image-20240620150558958

日期和时间

image-20240620150945778

文件上传

image-20240620151322052

Vue3

Vue3的项目初始化

image-20240622103632614

如何初始化Vue3项目

image-20240622103737757

初始化项目

image-20240622104025230

运行项目

image-20240622104055805

目录结构

整体与vue2相似,但还是有一点区别。

Vue2和Vue3的区别

  • Vue2属于选项氏API
  • Vue3属于组合式API

image-20240622104433035

image-20240622104628429

组合式API

setup函数

作用:数据和事件函数的初始化工作。

变量和事件想要在中使用必须要使用return

setup是执行在beforeCreate()之前的

image-20240622105133953

第二个案例理解vue2改造vue3

image-20240622105704829

setup语法糖

image-20240622105305770

其他方法就都包括在里面了

响应式函数

reactive

注意:reative响应的只有是对象,不能接受其他的形式

image-20240622110120163

ref

对象类型

当参数是一个对象

image-20240622110334097

简单类型

当参数是一个简单类型,数字、字符串、布尔

image-20240622110453903

数组类型

当参数是一个数组类型的时候

image-20240622110529013

属性

计算属性

image-20240622111004016

get和set写法

image-20240622111107634

侦听属性

watch(侦听属性,(新值,旧值))

image-20240622111551675

一般旧值写的会少一点,可以直接改成只有新值

image-20240622111659394

对象类型侦听

也就是深度侦听

image-20240622112606312

精确侦听

对侦听对象的某一个值进行侦听

image-20240622112823597

生命周期函数

image-20240622112926174

vue2

image-20240622113201601

组件通信

父传子通信

子组件的变化

image-20240622113513831

父组件的变化

image-20240622113848991

子传父通信

子组件的改造

image-20240622114210433

父组件的改造

image-20240622114404399

模版引用ref

这个要自己学一会

事件总线

provide与inject

Vuex

Vuex是专门为Vue.js设计的状态管理库,以利用Vue.js的细粒度数据响应机制来进行高效的状态更新。

实现了多组件共享数据。

image-20240622155332438

创建Vuex项目

image-20240622152244296

image-20240622153922789

创建store对象

新建一个js文件

三个对象的作用:

image-20240622154418773

创建store对象

image-20240622154639531

引入store对象

image-20240622154550455

image-20240622154550455

实现actions、mutations和state

image-20240622160051206

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

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

相关文章

Linux中网卡收发包的流程

进来在一个RTOS上移植开发网卡驱动&#xff0c;最终DMA收发包流程打通之后&#xff0c;在使用过程中觉得RTOS的处理逻辑太差了&#xff0c;因此有想法来梳理下Linux中对收发包流程处理&#xff0c;来给一些参考。 一、Linux接收网络包的流程 网卡是一个计算机的硬件&#xff0…

浅谈线性表——顺序表

文章目录 一、List接口二、线性表2.1、什么是线性表&#xff1f; 三、顺序表ArrayList什么是顺序表&#xff1f; 一、List接口 从上图看到List接口继承自Collection接口&#xff0c;而 ArrayList、LinkedList、Stack 类都实现了List接口&#xff0c;List是个接口&#xff0c;不…

论文新体验!分享8款人工智能AI软件论文网站

最近看到这个AI工具推广做的比较多&#xff0c;号称长文写的比kimi还要好&#xff01;难道大学生的救星下凡了&#xff1f;&#xff1f; 本文将分享8款优秀的AI软件论文网站&#xff0c;并重点推荐千笔-AIPassPaPer&#xff0c;这是一款备受用户好评的AI原创论文写作平台。 1…

C++ | 掌握C++异常处理:从基础到自定义异常体系的全面指南

09--异常 1、C语言传统的错误处理方式&#xff1a; 包括终止程序和返回错误码两种方式。 直接使用assert终止程序过于粗暴&#xff1a;用户无意的小错误也会造成程序结束运行。 return返回错误码&#xff0c;再通过错误码查找错误类型&#xff1a;过程繁琐&#xff0c;对用…

可视化基础的设计四大原则

一个好的数据可视化设计可以帮助观众迅速理解数据背后的意义。然而&#xff0c;如何确保我们的可视化设计既美观又简单易懂呢&#xff1f;本文将介绍四大设计原则——亲密原则、对比原则、对齐原则和重复原则。 1、 亲密原则&#xff08;Proximity&#xff09; 定义与应用&am…

学习大数据DAY34 面向对象思想深化练习 将从豆瓣爬取的数据置入自己搭建的网站上

目录 查看电影类型的电影列表 添加电影 修改电影 上机练习 13 使用三层架构完善 web 系统 查看电影类型的电影列表 DAL.py 文件 class MovieDAL(DBHelper): def getMovieByTid(self,typeid): sqlf"""select id,title,release_date,score,tname from Mo…

YOLOv8 | 融合改进 | C2f融合可变核卷积AKConv【附代码+小白可上手】

秋招面试专栏推荐 &#xff1a;深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 &#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 专栏目录 &#xff1a;《YOLOv8改进有效…

【JavaEE】深入理解Spring IoC与DI:从传统开发到依赖注入的转变

目录 IoC & DI ⼊⻔什么是Spring什么是容器什么是IoCIoC介绍传统程序开发问题分析解决方案IoC程序开发IoC优势 IoC & DI ⼊⻔ IoC&#xff1a;Inversion of Control (控制反转) DI&#xff1a;Dependency Injection 在前⾯我们学习了Spring Boot和Spring MVC的开发, 可…

DNS相关内容

一、dns的两种解析方式 1. 正向解析 将域名解析为 ip 地址 2. 逆向解析 将 ip 地址解析为域名 设置解析方式&#xff0c;都是在 zone 文件中 named.conf 解决权限 named.rfc1912.zone 解决解析方式 3.DNS 方向解析 把 192.168.71.145 这个 ip 地址逆向解析为 www.yuany…

Android逆向题解攻防世界-easyjava-难度6

纯Java实现&#xff0c;不涉及so, flag加密之后与指定字符串 “wigwrkaugala"比较判断&#xff0c;循环一个个字符加的&#xff0c;那可以一个个字符对应还原。 加密算法就在a,b类里面&#xff0c;代码直接复制到idea &#xff0c;枚举暴力破解。 每一位输入范围a-z , 找…

Lua脚本 快速掌握

1.Lua脚本概述 Lua是一种轻量级的编程语言&#xff0c;由巴西里约热内卢天主教大学开发。设计初衷是为了嵌入应用程序中&#xff0c;提供灵活的配置和脚本能力。Lua具有简洁的语法和强大的扩展性&#xff0c;使得它在多个领域得到了广泛应用。 Lua的特点包括动态类型、自动内…

The Sandbox 游戏制作教程第 4 章|使用装备制作游戏,触发独特互动

欢迎回到我们的系列&#xff0c;我们将记录 The Sandbox Game Maker 的 “On-Equip”&#xff08;装备&#xff09;功能的多种用途。 如果你刚加入 The Sandbox&#xff0c;On-Equip 功能是 “可收集组件”&#xff08;Collectable Component&#xff09;中的一个多功能工具&a…

C++ list【常用接口、模拟实现等】

1. list的介绍及使用 1.1 list的介绍 1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。 2.list的底层是双向链表结构&#xff0c;双向链表中每个元素存储在互不相关的独立节点中&#xff0c;在节点中通过指针指向其前…

MyBatisPlus 第二天

常用注解 1 TableName:数据库表名和实体类名不同时,会出现以下报错 在实体类上添加 TableName("t_user") 在开发的过程中&#xff0c;我们经常遇到以上的问题&#xff0c;即实体类所对应的表都有固定的前缀&#xff0c;例如t_或tbl_此时&#xff0c;可以使用MyBa…

el-tree自定义节点内容

<el-tree :data"data" :props"defaultProps" ref"treeRef" show-checkbox check-change"handleCheckChange"><!-- 自定义节点内容 --><template #default"{ node, data, store }"><span class"tr…

无人值守人工智能智慧系统数据分析:深度洞察与未来展望

无人值守人工智能智慧系统数据分析&#xff1a;深度洞察与未来展望 随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;技术已逐渐渗透到社会经济的各个领域&#xff0c;其中无人值守人工智能智慧系统作为AI技术应用的前沿阵地&#xff0c;正引领着一场深刻的…

【数量关系】毛娃儿笔记

一、导学 1、比例的常见作用 &#xff08;1&#xff09;通过份数求数量 甲&#xff1a;乙1:2 那么甲乙的人数总和一定是3的倍数 &#xff08;2&#xff09;得到倍数关系 不同的说法都可以转化为比例&#xff0c;比如甲是乙的两倍2:1、甲是乙的4/34:3、甲比乙多25%5:4 &am…

基于vue框架的4S店汽车维修保养管理系统28a7y(程序+源码+数据库+调试部署+开发环境)系统界面在最后面。

系统程序文件列表 项目功能&#xff1a;客户,技师,车辆信息,财务,客户维修,维修分配,维修订单,保养预约,保养分配,保养订单,维修费用,保养费用 开题报告内容 基于Vue框架的4S店汽车维修保养管理系统 开题报告 一、项目背景与意义 随着汽车产业的迅猛发展&#xff0c;4S店作…

【微前端中常见的问题及其解决办法】

随着前端技术的飞速发展&#xff0c;大型应用系统的复杂性和规模性日益增加&#xff0c;传统的单体前端架构逐渐暴露出维护成本高、升级困难、技术栈单一等问题。为了应对这些挑战&#xff0c;微前端&#xff08;Micro-Frontends&#xff09;作为一种新的架构模式应运而生。微前…

自研Vue3低代码海报制作平台第一步:基础拖拽组件开发

学习来源&#xff1a;稀土掘金 - 幽月之格大佬的技术专栏可拖拽、缩放、旋转组件 - 著作&#xff1a;可拖拽、缩放、旋转组件实现细节 非常感谢大佬&#xff01;受益匪浅&#xff01; 前面我们学习了很多vue3的知识&#xff0c;是时候把它们用起来做一个有意思的平台&#xf…