一文深入了解Vue2和Vue3的区别

简介: Vue3 相比 Vue2 来说,Vue3 重写了虚拟 Dom 实现,编译模板的优化,更高效的组件初始化,undate性能提高 1.3 ~ 2 倍,SSR 速度提高了 2 ~ 3 倍。

一文深入了解Vue2和Vue3的区别


Vue3 和 Vue2 的区别


考点


  • Vue3 和 Vue2 的介绍
  • Vue3 新增特性
  • Vue3 的优缺点
  • Vue2 的优缺点
  • Vue3 相对于Vue2 的非兼容性变更


答案


Vue3 的优点


1. 速度更快


  • Vue3 相比 Vue2 来说,Vue3 重写了虚拟 Dom 实现,编译模板的优化,更高效的组件初始化,undate性能提高 1.3 ~ 2 倍,SSR 速度提高了 2 ~ 3 倍。


2. 体积更小


  • 通过 webpacktree-shaking 功能,可以将无用模块“剪辑”,仅打包需要的模块。


3. 更易维护


  • compositon Api 可与现有的 Options API 一起使用。
  • 灵活的逻辑组合与复用。
  • Vue3 模块可以和其他框架搭配使用。


4. 更接近原生


  • 可以自定义渲染 API 。


更易使用


  • 响应式 Api 暴露出来。

1.png

  • 轻松识别组件重新渲染原因。


Vue3 新增特性


  • Vue3 中需要关注的一些新功能:


  • framents
  • Teleport
  • composition
  • createRenderer


framents


  • 在 Vue3.x 中,组件现在支持有多个根节点。
<!-- Layout.vue -->
<template>
  <header>...</header>
  <main v-bind="$attrs">...</main>
  <footer>...</footer>
</template>


Teleport


  • Teleport 是一种能够将我们的模板移动到 DOMVue app 之外的其他位置的技术,就有点像哆啦A梦的“任意门”。


  • vue2 中,像 modalstoast 等这样的元素,如果我们嵌套在 Vue 的某个组件内部,那么处理嵌套组件的定位z-index样式就会变得很困难。


  • 通过 Teleport ,我们可以在组件的逻辑位置写模板代码,然后在 Vue 应用范围之外渲染它。
<button @click="showToast" class="btn">打开 toast</button>
<!-- to 属性就是目标位置 -->
<teleport to="#teleport-target">
  <div v-if="visible" class="toast-wrap">
       <div class="toast-msg">我是一个 Toast 文案</div>
  </div>
</teleport>


createRenderer


  • 通过 createRenderer ,我们能够构建自定义渲染器,我们能够将 vue 的开发模型扩展到其他平台。


  • 我们可以将其生成在 canvas 画布上。

1.png

了解 createRenderer 的基本使用。

import { createRenderer } from '@vue/runtime-core'
const { render, createApp } = createRenderer({
  patchProp,
  insert,
  remove,
  createElement,
  // ...
})
export { render, createApp }
export * from '@vue/runtime-core'


composition Api


  • composition Api,也就是组合式 API,通过这种形式,我们能够更加容易维护我们的代码,将相同功能的变量进行一个集中式的管理


  • composition Api 的使用:

1.png

composition Api 的简单使用:

export default {
    setup() {
      const count = ref(0)
      const double = computed(() => count.value * 2)
      function increment() {
          count.value++
      }
      onMounted(() => console.log('component mounted!'))
      return {
          count,
          double,
          increment
      }
  }
}


非兼容性变更


Global API


  • 全局 Vue API 已更改为使用应用程序实例。


  • 全局内部 API 已经被重构为可 tree-shakable


模板指令


  • 组件上 v-model 用法已更改。
  • <template v-for>非 v-for 节点上 key 用法已更改。
  • 同一元素上使用的 v-ifv-for 优先级已更改。 * v-bind="object" 现在排序敏感。
  • v-for 中的 ref 不再注册 ref 数组


组件


  • 只能使用普通函数创建功能组件。
  • functional 属性在单文件组件 (SFC)
  • 异步组件现在需要 defineAsyncComponent 方法来创建。


渲染函数


  • 渲染函数 API 改变。
  • $scopedSlots property 已删除,所有插槽都通过 $slots 作为函数暴露。
  • 自定义指令 API 已更改为与组件生命周期一致。
  • 一些转换 class 被重命名了:
  • v-enter -> v-enter-from
  • v-leave -> v-leave-from
  • 组件 watch 选项和实例方法 $watch 不再支持点分隔字符串路径,请改用计算函数作为参数。
  • Vue 2.x 中,应用根容器的 outerHTML 将替换为根组件模板 (如果根组件没有模板/渲染选项,则最终编译为模板)。Vue3.x 现在使用应用程序容器的 innerHTML


其他小改变


  • destroyed 生命周期选项被重命名为 onUnmounted
  • beforeDestroy 生命周期选项被重命名为 onBeforeUnmount
  • [prop default 工厂函数不再有权访问 this 是上下文。
  • 自定义指令 API 已更改为与组件生命周期一致。
  • data 应始终声明为函数。
  • 来自 mixindata 选项现在可简单地合并
  • attribute 强制策略已更改。
  • 一些过渡 class 被重命名。
  • 组建 watch 选项和实例方法 $watch 不再支持以点分隔的字符串路径。请改用计算属性函数作为参数。
  • <template> 没有特殊指令的标记 (v-if/else-if/else、v-for 或 v-slot) 现在被视为普通元素,并将生成原生的 <template> 元素,而不是渲染其内部内容。
  • Vue 2.x 中,应用根容器的 outerHTML 将替换为根组件模板 (如果根组件没有模板/渲染选项,则最终编译为模板)。Vue 3.x 现在使用应用容器的 innerHTML,这意味着容器本身不再被视为模板的一部分。


移除 API


  • keyCode 支持作为 v-on 的修饰符。
  • $on$off$once 实例方法。
  • 过滤 filter
  • 内联模板 attribute
  • $destroy 实例方法。用户不应再手动管理单个 Vue 组件的生命周期。


扩展


能够使用 webpack 的 tree-shaking 有什么好处?


  • 对开发人员:能够使用 vue 开发出更多其他的功能,而不必担忧整体体积过大。
  • 对使用者:打包出来的包体积变小了。
相关文章
|
4月前
|
JavaScript 前端开发 安全
Vue 3
Vue 3以组合式API、Proxy响应式系统和全面TypeScript支持,重构前端开发范式。性能优化与生态协同并进,兼顾易用性与工程化,引领Web开发迈向高效、可维护的新纪元。(238字)
747 139
|
4月前
|
缓存 JavaScript 算法
Vue 3性能优化
Vue 3 通过 Proxy 和编译优化提升性能,但仍需遵循最佳实践。合理使用 v-if、key、computed,避免深度监听,利用懒加载与虚拟列表,结合打包优化,方可充分发挥其性能优势。(239字)
382 1
|
5月前
|
开发工具 iOS开发 MacOS
基于Vite7.1+Vue3+Pinia3+ArcoDesign网页版webos后台模板
最新版研发vite7+vue3.5+pinia3+arco-design仿macos/windows风格网页版OS系统Vite-Vue3-WebOS。
593 11
|
4月前
|
JavaScript 安全
vue3使用ts传参教程
Vue 3结合TypeScript实现组件传参,提升类型安全与开发效率。涵盖Props、Emits、v-model双向绑定及useAttrs透传属性,建议明确声明类型,保障代码质量。
459 0
|
6月前
|
缓存 前端开发 大数据
虚拟列表在Vue3中的具体应用场景有哪些?
虚拟列表在 Vue3 中通过仅渲染可视区域内容,显著提升大数据列表性能,适用于 ERP 表格、聊天界面、社交媒体、阅读器、日历及树形结构等场景,结合 `vue-virtual-scroller` 等工具可实现高效滚动与交互体验。
645 1
|
5月前
|
JavaScript
Vue中如何实现兄弟组件之间的通信
在Vue中,兄弟组件可通过父组件中转、事件总线、Vuex/Pinia或provide/inject实现通信。小型项目推荐父组件中转或事件总线,大型项目建议使用Pinia等状态管理工具,确保数据流清晰可控,避免内存泄漏。
502 2
|
4月前
|
缓存 JavaScript
vue中的keep-alive问题(2)
vue中的keep-alive问题(2)
426 137
|
8月前
|
人工智能 JavaScript 算法
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
Vue 中 key 属性的深入解析:改变 key 导致组件销毁与重建
975 0
|
8月前
|
JavaScript UED
用组件懒加载优化Vue应用性能
用组件懒加载优化Vue应用性能
|
9月前
|
JavaScript 数据可视化 前端开发
基于 Vue 与 D3 的可拖拽拓扑图技术方案及应用案例解析
本文介绍了基于Vue和D3实现可拖拽拓扑图的技术方案与应用实例。通过Vue构建用户界面和交互逻辑,结合D3强大的数据可视化能力,实现了力导向布局、节点拖拽、交互事件等功能。文章详细讲解了数据模型设计、拖拽功能实现、组件封装及高级扩展(如节点类型定制、连接样式优化等),并提供了性能优化方案以应对大数据量场景。最终,展示了基础网络拓扑、实时更新拓扑等应用实例,为开发者提供了一套完整的实现思路和实践经验。
1241 78