目录
Vue是一款用于构建用户界面的JS框架,基于标准HTML、CSS和JS构建,并提供一套声明式、组件化的编程模型,帮助开发者高效地开发UI( User Interface)
声明式渲染:Vue基于标准HTML拓展了一套模版语法,使得可以声明式地描述最终输出的HTML和JS状态之间的关系
响应性:Vue会自动跟踪JS状态并在其发生变化时响应式地更新DOM
渐进式框架
Vue为了满足web开发多层次的需求,Vue的设计非常注重灵活性和“可被逐步集成”这个特点(就像叠积木一样)
无需构建步骤,渐进式增强静态的HTML
在任何页面中作为 Web Components 嵌入(一套由W3C标准支持的浏览器原生技术,允许开发者可复用、高封装性自定义HTML元素)
单页应用(SPA)
全栈/服务器端渲染(SSR)
Jamstack/静态站点生成(SSG)
开发桌面端、移动端、WebGL,甚至是命令行终端界面
单文件组件
在大多数启用构建工具的Vue项目中,我们可以用类似于 HTML 格式来书写 Vue 组件,它被称为单文件组件( .vue 文件,英文 Single-File Components ,缩写 SFC )
单文件组件将一个组件的三大部分封装到一个文件里面
<template> 定义组件的HTML模版
<style> 定义组件的样式
<script> 编写组件的 JS / TS 逻辑,比如数据、方法等
比如连点计数器
<script setup>
import { ref } from 'vue'
const count = ref(0)
</script>
<template>
<button @click="count++">Count is: {{ count }}></button>
</template>
<style scoped>
button {
font-weight: bold;
}
</style>
API风格
Vue组件可以按照两种不同风格书写:选项式API 和 组合式API
选项式:Vue2中用包含多个选项的对象来描述组件的逻辑,例如 data、methods等,这些属性都会暴露在函数内部的 this 上,这是隐式的(自动将选项内容挂载到当前组件实例的 this 上)(在Vue3的组合式API中要求显式 return 暴露内容
<script>
export default {
// data() 返回的属性将会成为响应式的状态
// 并且暴露在 `this` 上
data() {
return {
count: 0
}
},
// methods 是一些用来更改状态与触发更新的函数
// 它们可以在模板中作为事件处理器绑定
methods: {
increment() {
this.count++
}
},
// 生命周期钩子会在组件生命周期的各个不同阶段被调用
// 例如这个函数就会在组件挂载完成后被调用
mounted() {
console.log(`The initial count is ${this.count}.`)
}
}
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
组合式:使用导入的 API 函数来描述组件逻辑,在但文件组件中,组合式 API 通常和 <script setup> 搭配使用,这个 setup 是一个标识,告诉 Vue 需要在编译时进行一些处理,让我们可以更简洁地使用组合式 API ,比如 , <script setup> 中导入和顶层变量/函数都可以在模版中直接使用
<script setup>
import { ref, onMounted } from 'vue'
// 响应式状态
const count = ref(0)
// 用来修改状态、触发更新的函数
function increment() {
count.value++
}
// 生命周期钩子
onMounted(() => {
console.log(`The initial count is ${count.value}.`)
})
</script>
<template>
<button @click="increment">Count is: {{ count }}</button>
</template>
Vue3和Vue2有什么区别
核心架构与性能
-
响应式系统:(响应式系统是 Vue 框架的核心特性之一,它能够自动追踪 JavaScript 状态变化并在变化发生时更新相关的 DOM。简单来说,它建立了数据与视图之间的自动同步机制,当数据变化时,视图会自动更新,无需手动操作 DOM,Vue能够智能地推导出需要重新渲染的组件的最少数量,并应用最少的 DOM操作)
- Vue2 基于
Object.defineProperty,通过 data 选项定义响应式数据
- Vue3 使用
Proxy
,提供更全面的响应式能力和更好的性能,通过 setup 函数和 Composition
- Vue2 基于
(setup 是 Vue3中 Composition API(组合式API) 的入口,它是组件内的一个特殊函数,在组件实例创建时,在初始 prop 解析后立即执行)
(Composition API 是 Vue3 引入的新的组织组件逻辑的方式,主要概念如下:
-
响应式系统:
-
生命周期钩子:
- onMounted、
onUpdated
、onUnmounted
等,用于在相应的生命周期阶段执行代码
- onMounted、
-
计算属性和监听器:
computed
:创建一个计算属性watch
/watchEffect
:监听响应式数据的变化)
-
性能优化:
- Vue3 打包体积更小(减少约40%)
- 更优的内存占用和渲染速度
- 改进的静态树提升和事件缓存
Vue2只能有一个应用实例,而Vue3可以有多个应用实例
API 设计(Application Programming Interface)
-
组合式 API:
- Vue3 引入了组合式 API (Composition API),解决了选项式 API 在大型应用中的代码组织问题( Vue2 的话得在2.7版本以后才能用 组合式API )
- 更好的逻辑复用和代码组织能力
-
全局 API 改变:
- Vue2: 直接修改全局 Vue 对象
- Vue3: 使用
createApp()
创建应用实例,避免全局污染
语法与功能增强
Vue实例创建方式
- Vue 2: `const app = new Vue({ el: '#app', ... })`
- Vue 3 用 .mount( ) 方式: `const app = Vue.createApp({ ... }).mount('#app')`
-
生命周期钩子
-
-
与传统Vue2钩子不同,setup内不能使用 this 访问组件实例
-
Vue2 中用 created() 作为选项,Vue3 中 onMounted() 在 setup() 里面使用
-
Vue3 重命名了部分钩子(如
beforeDestroy
→beforeUnmount
) -
组合式 API 中使用新的生命周期函数
-
方法定义
Vue2 在 methods 选项中定义方法;而 Vue3 在 setup() 中定义常规函数
HTML 模版更改
插槽语法从 slot 属性改为 # 前缀语法
-
多根节点组件
- Vue2 组件必须有一个单一根元素
- Vue3 支持多根节点组件(Fragment)
-
Teleport 组件
- Vue3 新增,可以将内容渲染到 DOM 树的任意位置
-
多 v-model 支持
- Vue2 一个组件只能有一个 v-model
- Vue3 支持多个 v-model 绑定
Element UI 升级为 Element Plus
更新了组件的使用方法
图标系统改为独立的 @element-plus/icons-vue 包
开发体验
-
TypeScript 支持:
- Vue3 使用 TypeScript 重写,提供更好的类型推断和支持
-
Suspense:
- Vue3 新增,用于处理异步组件和异步数据加载状态
-
更好的 Tree-shaking:
- Vue3 大多数 API 都支持 tree-shaking,可以减少打包体积
-
自定义渲染器 API:
- Vue3 提供更简洁的渲染器 API,便于创建自定义渲染器
Vue3 在保留 Vue2 核心优势的同时,在架构、性能和开发体验等方面有了显著提升。