【Web前端】Vue2与Vue3核心概览与优化对比

📚 Vue 2 核心知识体系

Vue 2 是一个用于构建用户界面的渐进式 JavaScript 框架,其核心概念主要包括以下几个方面。

1. 基础语法与模板

1)模板语法 :使用双大括号 {``{ }} 进行文本插值,以及指令(如 v-bind, v-model, v-if, v-for 等)来操作 DOM。

2)Vue 实例 :每个 Vue 应用都是通过 new Vue() 创建的 Vue 实例,包含数据、方法、生命周期钩子等选项。

3)计算属性与侦听器

① 计算属性 (computed):用于声明依赖数据变化的复杂逻辑,具有缓存性,只有当依赖变化时才重新计算。

② 侦听器 (watch):用于观察和响应 Vue 实例上的数据变动,执行异步或开销较大的操作。

2. 数据绑定与响应式

1)响应式原理 :Vue 2 使用 Object.defineProperty 来劫持各个属性的 getter 和 setter,实现数据响应式。对于数组,需要重写数组的变异方法(如 push, pop 等)来实现响应式。

2)数据绑定

① 单向绑定 :使用 {``{}} 插值和 v-bind 指令。

② 双向绑定 :使用 v-model 指令,本质上是语法糖,通过 v-bind:valuev-on:input 实现。

3. 指令系统

常用内置指令包括:

1)条件渲染v-if, v-else, v-else-if, v-show

2)列表渲染v-for (须指定 key

3)事件处理v-on (可搭配事件修饰符,如 .stop, .prevent 等)

4)属性绑定v-bind (可简写为 :

5)双向绑定v-model

4. 组件系统

1)组件定义与注册:分为全局注册和局部注册。

2)组件通信

① 父传子 :通过 props

② 子传父 :通过 $emit 触发事件。

③ 其他方式 :自定义事件(event.$on, event.$off, event.$emit)、Vuex 状态管理。

3)内容分发 :通过 <slot> 插槽实现,包括默认插槽、具名插槽和作用域插槽。

4)组件生命周期

beforeCreate, created, beforeMount, mounted, beforeUpdate, updated, beforeDestroy, destroyed 等钩子函数。父子组件生命周期执行顺序有特定规律。

5)组件 data:必须是一个函数,以确保每个组件实例拥有独立的数据对象。

5. 路由与状态管理

1)Vue Router:官方路由管理器,用于构建单页面应用 (SPA)。

包含路由配置、动态路由、嵌套路由、导航守卫等概念。

2)Vuex:官方状态管理库,采用集中式存储管理应用的所有组件的状态。

核心概念:State、Getter、Mutation(同步修改状态)、Action(异步操作,提交 Mutation)。

6. 生命周期钩子

Vue 实例在其生命周期中会触发一系列钩子函数,允许你在特定阶段执行自定义代码。常用钩子及其应用场景如下表所示:

生命周期钩子 触发时机与常见应用场景
beforeCreate 实例初始化之后,数据观测和事件/监听器配置之前被调用。常用于初始化非响应式变量。
created 实例创建完成,数据观测、属性和方法运算完成,但 $el 属性尚未显示。常用于异步数据请求。
beforeMount 挂载开始之前被调用,相关的 render 函数首次被调用。
mounted 实例挂载到 DOM 后调用。可访问 DOM 元素,常用于依赖 DOM 的初始化或异步数据请求。
beforeUpdate 数据更新时调用,发生在虚拟 DOM 重新渲染和打补丁之前。
updated 由于数据更改导致的虚拟 DOM 重新渲染和打补丁之后调用。可操作更新后的 DOM。
beforeDestroy 实例销毁之前调用。这一步实例仍然完全可用。常用于清理定时器、解绑自定义事件等。
destroyed 实例销毁后调用。该钩子被调用后,对应 Vue 实例的所有指令都被解绑,事件监听器被移除,子实例也被销毁。

7. 工具与生态

1)Vue CLI:官方标准脚手架工具,用于快速创建和管理 Vue 项目。

2)Vue Devtools:浏览器调试扩展,用于可视化调试 Vue 应用。

⚡ Vue 3 新特性与优化

Vue 3 在性能、包大小和开发体验上都有显著提升,并引入了新的 API 和特性。

1. 性能优化

Vue 3 在性能方面做了大量优化,主要体现在:

优化方面 Vue 2 的情况 Vue 3 的优化
响应式系统 使用 Object.defineProperty,无法检测对象属性的添加/删除,对数组需重写方法。 使用 Proxy 实现响应式,直接监听对象和数组变化,性能更高且无需 hack 数组方法。
虚拟 DOM 与 Diff 算法 全量对比虚拟 DOM 树。 编译时优化: • 静态提升 (Static Hoisting): 将静态节点提升到渲染函数外,避免重复创建和渲染。 • Patch Flag: 在虚拟 DOM 生成时为动态节点添加标记,Diff 时仅比较带标记的节点,减少比对范围。 **• 事件监听器缓存 (Cache Event Handlers):**缓存内联事件处理函数,避免不必要的更新。
Tree-shaking 支持较弱。 更好的支持,打包时能移除未使用的代码(如可选组件、指令),减小最终打包体积。
SSR 渲染 性能一般。 对静态内容大幅优化,使用 _createStaticVNode 方法生成 static node,直接 innerHTML,提升服务端渲染性能。

2. Composition API

这是 Vue 3 最重要的新 API,旨在解决 Options API 在逻辑复杂组件中代码分散的问题。

1)核心 setup 函数

① 作为 Composition API 的入口点,在组件创建(beforeCreate 之前)执行。

② 接收 propscontext 参数。

③ 返回一个对象,其属性暴露给模板的其余部分。

2)响应式引用与对象

① ref :用于创建基本类型的响应式数据,通过 .value 访问和修改。

② reactive:用于创建对象类型的响应式数据。

3)计算属性与侦听器

① computed:创建计算属性。

② watch 与**watchEffect**:用于侦听响应式数据的变化并执行副作用。

4)生命周期钩子 :提供了一套与 Options API 生命周期钩子对应,但以 on 开头的函数(如 onMounted, onUpdated 等),可在 setup 中使用。

5)逻辑复用与代码组织:通过 Composition API,可以将与特定功能相关的数据、计算属性和方法组织在一起,并轻松提取到可复用的组合式函数中。

3. 新特性与语法变化

1)Fragments (多根节点组件):组件模板不再强制要求单个根元素。

2)Teleport:允许将组件模板的一部分"传送"到当前组件 DOM 层次结构之外的 DOM 中,非常适合模态框、通知框等。

3)Suspense(实验性):提供了一种在组件树中协调嵌套异步依赖(如异步组件)的加载状态的标准方式。

4)v-model 升级

① 在 Vue 2 中,一个组件上只能使用一个 v-model

② 在 Vue 3 中,支持多个 v-model ,例如 v-model:title="title" v-model:content="content"

③ 默认使用 modelValue 作为 prop,update:modelValue 作为事件。

5)自定义指令 API 变更 :指令的钩子函数名称和参数与组件生命周期钩子对齐(如 beforeMount -> beforeMount, inserted -> mounted 等)。

4. 更好的 TypeScript 支持

1)Vue 3 的源码完全使用 TypeScript 重写。

2)提供了更好的类型推断和类型支持。

3)Composition API 的设计与 TypeScript 的结合更加自然和高效。

🔍 Vue 2 与 Vue 3 主要区别对比

对比维度 Vue 2 Vue 3
响应式系统 Object.defineProperty Proxy
API 风格 Options API Composition API (也支持 Options API)
碎片 (Fragments) 不支持,单根节点 支持,多根节点
TypeScript 支持 支持,但集成度较低 原生支持更好
打包体积 较大 Tree-shaking 优化,体积更小
性能 相对较低 虚拟 DOM 优化、响应式优化,性能更高
v-model 单个 多个
自定义指令 API bind, inserted beforeMount, mounted 等,与组件生命周期对齐
生命周期钩子 beforeDestroy, destroyed beforeUnmount, unmounted (Composition API 中为 onBeforeUnmount, onUnmounted)
按键修饰符 支持 v-on:keyup.enter 不再支持 keyCode 作为修饰符

Vue 3 通过其性能提升、更灵活的 Composition API 和更好的 TypeScript 支持,为构建现代、高效、可维护的 Web 应用提供了强大的工具集。

相关推荐
li@h1 小时前
如何在电脑端访问小程序时在胶囊添加一个全屏和缩放功能
前端
千里马-horse1 小时前
创建 Effect 应用
typescript·effect
aiguangyuan2 小时前
React 18 源码解读(一)
javascript·react·前端开发
LFly_ice2 小时前
学习React-23-React-router
前端·学习·react.js
haofafa2 小时前
JavaScript性能优化实战
开发语言·javascript·性能优化
我叫张小白。2 小时前
TypeScript对象类型与接口:构建复杂数据结构
前端·javascript·typescript
O***p6042 小时前
JavaScript增强现实开发
开发语言·javascript·ar
墨客希2 小时前
如何快速掌握大型Vue项目
前端·javascript·vue.js
大福ya3 小时前
AI开源项目改造NextChat(ChatGPT-Next-Web)实现前端SSR改造打造一个初始框架
前端·chatgpt·前端框架·开源·aigc·reactjs·ai编程