老生常谈: 谈谈对vue的理解?vue3有而vue2没有的东西或者说特性?
2025-04-05 09:51 阅读(39)

对Vue的理解:从"老生常谈"到本质认知

Vue本质上是一个渐进式JavaScript框架,其核心设计哲学体现在三个方面:


响应式驱动:通过数据绑定实现UI自动更新("数据改变 → 视图自动更新"的魔法)

组件化开发:将UI拆分为独立可复用的组件单元

渐进式体验:可从简单的视图层逐步扩展到路由/状态管理等完整解决方案


Vue3 独有特性(相比Vue2的突破)

一、架构革新

Composition API

解决Vue2 Options API的代码组织问题(相同逻辑分散在data/methods中)

示例对比:

// Vue2
export default {
  data() { return { count: 0 } },
  methods: { increment() { this.count++ } }
}

// Vue3
import { ref } from 'vue'
export default {
  setup() {
    const count = ref(0)
    const increment = () => count.value++
    return { count, increment }
  }
}

性能优化

重写虚拟DOM:编译时优化+动态标记(diff算法效率提升30%+)

静态树提升:跳过静态节点比对

示例:模板编译后会标记动态节点(/*dynamic*/)


二、响应式系统升级

Proxy替代defineProperty


解决Vue2无法检测对象属性新增/删除的问题

性能更好(无需递归初始化所有属性)

// Vue2中需要Vue.set(obj, 'newProp', value)
// Vue3直接操作即可
const obj = reactive({ a: 1 })
obj.b = 2 // 自动触发响应

Ref与Reactive分离


ref()处理基本类型(自动装箱为{ value: xxx })

reactive()处理对象类型

三、新特性

Teleport组件


解决模态框/Toast等需要脱离当前DOM结构的场景

示例:

<teleport to="body">
  <div class="modal">...</div>
</teleport>

Suspense组件


优雅处理异步组件加载状态

示例:

<Suspense>
  <template #default><AsyncComponent /></template>
  <template #fallback>Loading...</template>
</Suspense>

Fragment支持


组件可返回多个根节点(Vue2必须单根)

示例:

<template>
  <header>...</header>
  <main>...</main>
</template>

四、开发体验提升

更好的TypeScript支持


源码用TS重写

完善的类型推导(包括模板中的类型检查)


自定义渲染器API


可创建针对Canvas/WebGL等非DOM环境的渲染器

Vite原生支持


开发时秒级启动(基于ES Modules)

从"老生常谈"到深度思考

Vue3的突破不仅是技术升级,更是开发范式的转变:


逻辑关注点分离:Composition API让代码按功能而非选项类型组织

更好的可维护性:TypeScript支持+响应式改进减少隐蔽bug

更接近原生JS:Proxy/Reflect的使用使框架更"透明"


这些改变让Vue在保持易用性的同时,具备了开发大型复杂应用的能力。正如Evan You所说:"Vue3是让简单的事情保持简单,复杂的事情变得可能。"