Vue3 全面介绍

Vue3(正式名称为 Vue.js 3)是 Vue.js 前端框架的第三个主要版本,于 2020 年 9 月正式发布。作为对 Vue2 的重大升级,Vue3 在核心架构、性能优化、开发体验等方面进行了全面重构,同时保持了 Vue 一贯的“渐进式框架”理念,让开发者可以根据需求逐步采用其新特性。

一、Vue3 的核心改进

1. 全新的响应式系统

Vue3 放弃了 Vue2 中基于 Object.defineProperty 的响应式实现,转而采用 Proxy API,带来以下优势:

原生支持数组索引和长度的响应式变化,无需像 Vue2 那样重写数组方法(如 pushsplice);

支持对象动态添加/删除属性的响应式监听,Vue2 中需通过 Vue.set/this.$set 手动处理;

响应式系统更高效,仅在访问属性时建立依赖,而非递归遍历对象所有属性;

支持 MapSet 等原生集合类型的响应式。

示例:Vue3 中动态添加响应式属性

import { reactive } from 'vue'
const state = reactive({ name: 'Vue3' })
// 动态添加属性,自动具备响应式
state.age = 5 
console.log(state.age) // 5(视图会同步更新)

2. 组合式 API(Composition API)

组合式 API 是 Vue3 的核心特性之一,旨在解决 Vue2 选项式 API(Options API)在大型项目中的痛点:

选项式 API 中,逻辑分散在 datamethodscomputed 等选项中,复杂组件的逻辑难以聚合和用;

组合式 API 允许将相关逻辑(如数据、方法、监听)封装在一个函数中,实现“按功能组织代码”,而非“按选项类型组织代码”;

支持在多个组件间复用复杂逻辑,无需依赖混入(Mixin),避免混入带来的命名冲突和逻辑来源不清晰问题。

示例:组合式 API 实现计数器逻辑

import { ref, computed, onMounted } from 'vue'
export default {setup() {// 1. 定义响应式数据const count = ref(0)// 2. 定义计算属性const doubleCount = computed(() => count.value * 2)// 3. 定义方法const increment = () => {count.value++}// 4. 生命周期钩子onMounted(() => {console.log('组件挂载完成,初始 count 为', count.value)})// 5. 暴露给模板使用return { count, doubleCount, increment }}
}

3. 更好的 TypeScript 支持

Vue3 从底层使用 TypeScript 重写,相比 Vue2(需通过声明文件兼容 TypeScript),提供了更完善的类型推导:

组合式 API 中的 refreactive 等 API 可自动推导数据类型,减少手动定义类型的工作量;

组件的 propsemits 选项支持精确的类型校验;

支持在模板中进行类型检查(需配合 Volar 编辑器插件),提前发现类型错误。

示例:TypeScript + 组合式 API 定义 props

import { defineProps } from 'vue'
// 定义 props 并指定类型
const props = defineProps<{title: stringcount?: number // 可选属性isVisible: boolean
}>()
// 使用 props 时自动获得类型提示
console.log(props.title.length) // 无类型错误
console.log(props.count?.toFixed(2)) // 可选链语法安全使用

4. 性能优化

Vue3 在编译和运行时层面进行了多项优化,性能显著优于 Vue2:

编译优化:模板编译时生成更高效的渲染函数,减少虚拟 DOM 的对比次数(如静态节点提升、补丁标记优化);静态属性(如 class="btn")会被提取到渲染函数外部,避免每次渲染时重复创建;条件渲染(v-if)和列表渲染(v-for)的编译逻辑优化,减少不必要的 DOM 操作。

运行时优化:响应式系统基于 Proxy,减少不必要的依赖追踪;虚拟 DOM 算法优化,对比时仅关注动态节点,提升更新效率;支持片段(Fragments),组件可返回多个根节点,无需额外包裹 div,减少 DOM 层级。

5. 内置组件与 API 调整

Vue3 对部分内置组件和 API 进行了调整,增强功能或简化使用:

特性Vue2 情况Vue3 改进
片段(Fragments)组件必须有唯一根节点,需用 div 包裹支持多根节点,无需包裹,编译时自动处理
v-model语法复杂,需配合 sync 修饰符实现双向绑定简化语法,支持多个 v-model,可自定义绑定属性和事件
Teleport无内置组件,需通过第三方库实现“组件内容挂载到指定 DOM 位置”内置 <Teleport> 组件,轻松实现弹窗、下拉菜单等场景
Suspense无内置支持,异步组件加载状态需手动处理内置 <Suspense> 组件,统一管理异步组件的加载、错误状态
生命周期钩子选项式 API(如 mountedupdated组合式 API 中提供独立函数(如 onMountedonUpdated),更灵活

二、Vue3 的两种组件写法

Vue3 支持两种组件开发方式,开发者可根据项目需求和团队习惯选择:

1. 选项式 API(Options API)

与 Vue2 的写法兼容,适合简单组件或习惯选项式开发的开发者。Vue3 对选项式 API 进行了部分兼容优化,确保现有 Vue2 项目可平滑迁移。

2. 单文件组件(SFC)+ 组合式 API

Vue3 推荐的写法,结合单文件组件(.vue 文件)和组合式 API,适合复杂组件和大型项目。Vue3 还支持 <script setup> 语法糖,进一步简化组合式 API 的代码:

无需手动导出组件(export default);

无需在 setup() 函数中返回数据和方法,直接定义即可在模板中使用;

支持自动导入 refcomputed 等 API(需配合构建工具配置)。

三、Vue3 的生态系统

Vue3 发布后,其官方生态工具也已同步升级,确保开发体验的一致性:

1. 构建工具:Vite

Vite 是 Vue 作者尤雨溪开发的新一代构建工具,相比 Webpack,具有以下优势:

开发环境启动速度极快(基于 ES 模块原生支持,无需打包);

热更新(HMR)响应迅速,修改代码后立即生效;

默认支持 Vue3、TypeScript、JSX 等,零配置即可使用;

生产环境基于 Rollup 打包,体积小、性能优。

创建 Vue3 + Vite 项目的命令:

# 使用 npm
npm create vite@latest my-vue3-project -- --template vue
# 进入项目目录并安装依赖
cd my-vue3-project
npm install
# 启动开发服务器
npm run dev

2. 路由:Vue Router 4

Vue Router 4 是 Vue3 的官方路由插件,与 Vue3 深度兼容,主要改进:

支持组合式 API,提供 useRouteruseRoute 等 Hook,方便在 setup 函数中使用路由;

支持路由参数的响应式监听,无需手动监听 $route 变化;

优化路由匹配算法,支持动态路由和嵌套路由的更灵活配置。

示例:Vue Router 4 在组合式 API 中的使用

import { useRouter, useRoute } from 'vue-router'
export default {setup() {const router = useRouter()const route = useRoute()// 获取路由参数console.log(route.params.id)// 跳转路由const goToHome = () => {router.push('/home')}return { goToHome }}
}

3. 状态管理:Pinia

Pinia 是 Vue3 官方推荐的状态管理库,替代了 Vue2 中的 Vuex,主要优势:

完全支持 TypeScript,类型推导更完善;

简化 API,无需 mutations(Pinia 中直接通过 actions 修改状态,支持同步和异步);

支持组合式 API,可在 setup 函数中轻松使用;

体积更小,性能更优,支持多仓库(多个 Store)。

示例:创建 Pinia Store 并使用

// 1. 创建 Store(src/stores/counter.js)
import { defineStore } from 'pinia'
export const useCounterStore = defineStore('counter', {state: () => ({ count: 0 }),actions: {increment() {this.count++},async incrementAsync() {await new Promise(resolve => setTimeout(resolve, 1000))this.count++}},getters: {doubleCount: (state) => state.count * 2}
})// 2. 在组件中使用
import { useCounterStore } from '@/stores/counter'
import { setup } from 'vue'
export default {setup() {const counterStore = useCounterStore()return {count: counterStore.count,doubleCount: counterStore.doubleCount,increment: counterStore.increment,incrementAsync: counterStore.incrementAsync}

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

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

相关文章

HTTP 范围请求:为什么你的下载可以“断点续传”?

在现代网络应用中&#xff0c;我们习以为常的功能&#xff0c;如断点续传、多线程下载和在线视频快进快退&#xff0c;都依赖于 HTTP 协议中的一个强大特性&#xff1a;范围请求&#xff08;Range Requests&#xff09;。这项技术让客户端能够聪明地只请求文件的一部分&#xf…

万博智云联合华为云共建高度自动化的云容灾基线解决方案

一、摘要 近日&#xff0c;万博智云与华为云的深入合作再添新章——万博智云HyperBDR云容灾解决方案&#xff0c;顺利通过华为云专家团队评审和认证&#xff0c;正式被选为华为云基线解决方案&#xff08;Baseline Solution&#xff09;&#xff0c;并在华为云国际站上线。 Hy…

机器视觉opencv教程(二):二值化、自适应二值化

文章目录机器视觉opencv教程&#xff08;二&#xff09;&#xff1a;二值化、自适应二值化一、二值化图基础概念二、传统二值化方法&#xff08;基于全局固定阈值&#xff09;1. 阈值法&#xff08;THRESH_BINARY&#xff09;2. 反阈值法&#xff08;THRESH_BINARY_INV&#xf…

leetcode 461 汉明距离

一、问题描述二、解题思路采用位运算的思想来解决这个问题&#xff0c;首先&#xff0c;将x和y进行异或&#xff0c;x和y对应二进制位不同就会得到1&#xff0c;然后统计所有1的个数&#xff0c;即为汉明距离。三、代码实现时间复杂度&#xff1a;T(n)O(n)空间复杂度&#xff1…

ClickHouse 客户端

ClickHouse 客户端 ClickHouse提供两种客户端接口&#xff0c;分别基于 HTTP 和 TCP 协议 基于 HTTP 协议 主要用来支持轻量级的简单操作&#xff0c;方便跨平台和编程语言。 测试clickhouse联通性&#xff1a; $ curl http://localhost:8123/ Ok.在运行状况检查脚本中使用…

DBeaver 连接 PostgreSQL 教程

&#x1f6e0;️ DBeaver 连接 PostgreSQL 教程1️⃣ 安装 DBeaver打开官网&#xff1a;https://dbeaver.io/download/下载 Community Edition&#xff08;免费版&#xff09;&#xff0c;选择对应系统&#xff08;Windows / macOS / Linux&#xff09;。安装完成后&#xff0c…

Komo Searc-AI驱动的搜索引擎

本文转载自&#xff1a;Komo Searc-AI驱动的搜索引擎 - Hello123工具导航 ** 一、&#x1f50d; Komo Search 是什么&#xff1f; Komo Search 是一款基于人工智能技术的新一代交互式搜索引擎&#xff0c;它彻底改变了我们获取信息的方式 —— 从被动检索变成主动对话。不同于…

HTML 和 JavaScript 关联的基础教程

HTML 和 JavaScript 是构建现代网页的核心技术。HTML 负责页面结构&#xff0c;JavaScript 负责动态交互。以下是两者的基本关联方式。内联方式&#xff1a;直接在 HTML 中嵌入 JavaScript在 HTML 文件中&#xff0c;可以通过 <script> 标签直接编写 JavaScript 代码。这…

淘宝四个月造了一个超越美团的“美团”

本周三&#xff0c;美团发布最新一季财报&#xff0c;利润承压导致股价爆跌。只隔一天&#xff0c;阿里也发布了最新季报&#xff0c;最大的亮点是“淘宝闪购”即时零售业务&#xff0c;日均订单量站稳8000万单&#xff0c;峰值订单更是达到了1.2亿单。8000万单这个数字令市场眼…

Java开发MongoDB常见面试题及答案

基础概念题1. 什么是MongoDB&#xff1f;它的主要特点是什么&#xff1f;答案&#xff1a; MongoDB是一个开源的NoSQL文档型数据库&#xff0c;主要特点包括&#xff1a;文档存储&#xff1a;使用BSON格式存储数据&#xff0c;类似JSON结构无Schema约束&#xff1a;灵活的数据结…

AI视频生成工具全景对比:元宝AI、即梦AI、清影AI和Vidu AI

AI视频生成技术正以前所未有的速度发展&#xff0c;成为内容创作领域的重要革新力量。本文将全面对比四款主流AI视频生成工具&#xff1a;元宝AI、即梦AI、清影AI生视频和Vidu AI&#xff0c;从公司背景、技术路线、产品特点、发展历程和市场定位等多个维度进行深入分析。一、基…

2026届大数据毕业设计选题推荐-基于Python的出行路线规划与推荐系统 爬虫数据可视化分析

&#x1f525;作者&#xff1a;it毕设实战小研&#x1f525; &#x1f496;简介&#xff1a;java、微信小程序、安卓&#xff1b;定制开发&#xff0c;远程调试 代码讲解&#xff0c;文档指导&#xff0c;ppt制作&#x1f496; 精彩专栏推荐订阅&#xff1a;在下方专栏&#x1…

基于SpringBoot的高校科研项目管理系统【2026最新】

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

【开题答辩全过程】以 在线考试系统为例,包含答辩的问题和答案

个人简介一名14年经验的资深毕设内行人&#xff0c;语言擅长Java、php、微信小程序、Python、Golang、安卓Android等开发项目包括大数据、深度学习、网站、小程序、安卓、算法。平常会做一些项目定制化开发、代码讲解、答辩教学、文档编写、也懂一些降重方面的技巧。感谢大家的…

Marin说PCB之POC电路layout设计仿真案例---11

上节文章中大家不知道发现没有我们RX0_96712_FAKRA_3--TDR结果显示芯片端口阻抗还是偏低一些&#xff0c;但是这个该如何去改善优化设计呢&#xff1f;因为目前的PCB设计上&#xff0c;RX0_96712_FAKRA_3这个信号在芯片焊盘处是已经做了隔层参考的优化处理了&#xff1a;RX0_96…

【踩坑】修复 clear 报错 terminals database is inaccessible

转载请注明出处&#xff1a;小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你&#xff0c;欢迎[点赞、收藏、关注]哦~ 主要原因&#xff1a;Anaconda3 路径中的 clear 命令干扰了系统中的 clear 命令。 可能操作&#xff1a;你可能在安装后将 anaconda 目录移动了&#…

重学JS-005 --- JavaScript算法与数据结构(五)回顾 DOM 操作

文章目录style.displayinnerText学到的代码写法小总结style.display 使用元素的 style.display 属性&#xff0c;将属性的值设置为 “block” 或 “none”&#xff0c;可以显示或隐藏元素。 resetGameBtn.style.display block; optionsContainer.style.display none;innerT…

ArcGIS:如何设置地图文档的相对路径或者发布为地图包

设置好的地图文档在分享给别人使用或查看时&#xff0c;可能会出现这样的问题&#xff1a;这是因为地图文档里面的数据存储的是绝对路径&#xff0c;当别人打开时&#xff0c;地图文档无法识别到正确的数据路径。遇到这样的问题有三种解决办法&#xff1a;点击未能加载的数据&a…

深入解析 Java interrupt

Java 中断(Interrupt)机制详解 Java 的中断机制是一种协作式的线程间通信机制&#xff0c;用于请求另一个线程停止当前正在执行的操作。 Thread thread Thread.currentThread(); thread.interrupt(); // 设置当前线程的中断状态 检查中断状态 // 检查中断状态 boolean isI…

SOME/IP-SD事件组订阅

<摘要> 本文将结合AUTOSAR R22-11版本的《PRS_SOMEIPServiceDiscoveryProtocol》规范&#xff0c;解析SOME/IP-SD协议中的事件组订阅机制。针对“事件组订阅”&#xff0c;将从背景概念、设计意图、实际案例及图示等角度展开分析&#xff0c;通过通俗易懂的阐述和图文表格…