一文深入了解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 开发出更多其他的功能,而不必担忧整体体积过大。
  • 对使用者:打包出来的包体积变小了。
相关文章
|
26天前
|
缓存 JavaScript UED
Vue3中v-model在处理自定义组件双向数据绑定时有哪些注意事项?
在使用`v-model`处理自定义组件双向数据绑定时,要仔细考虑各种因素,确保数据的准确传递和更新,同时提供良好的用户体验和代码可维护性。通过合理的设计和注意事项的遵循,能够更好地发挥`v-model`的优势,实现高效的双向数据绑定效果。
127 64
|
26天前
|
前端开发 JavaScript 测试技术
Vue3中v-model在处理自定义组件双向数据绑定时,如何避免循环引用?
Web 组件化是一种有效的开发方法,可以提高项目的质量、效率和可维护性。在实际项目中,要结合项目的具体情况,合理应用 Web 组件化的理念和技术,实现项目的成功实施和交付。通过不断地探索和实践,将 Web 组件化的优势充分发挥出来,为前端开发领域的发展做出贡献。
30 8
|
25天前
|
存储 JavaScript 数据管理
除了provide/inject,Vue3中还有哪些方式可以避免v-model的循环引用?
需要注意的是,在实际开发中,应根据具体的项目需求和组件结构来选择合适的方式来避免`v-model`的循环引用。同时,要综合考虑代码的可读性、可维护性和性能等因素,以确保系统的稳定和高效运行。
28 1
|
25天前
|
JavaScript
Vue3中使用provide/inject来避免v-model的循环引用
`provide`和`inject`是 Vue 3 中非常有用的特性,在处理一些复杂的组件间通信问题时,可以提供一种灵活的解决方案。通过合理使用它们,可以帮助我们更好地避免`v-model`的循环引用问题,提高代码的质量和可维护性。
35 1
|
26天前
|
JavaScript
在 Vue 3 中,如何使用 v-model 来处理自定义组件的双向数据绑定?
需要注意的是,在实际开发中,根据具体的业务需求和组件设计,可能需要对上述步骤进行适当的调整和优化,以确保双向数据绑定的正确性和稳定性。同时,深入理解 Vue 3 的响应式机制和组件通信原理,将有助于更好地运用 `v-model` 实现自定义组件的双向数据绑定。
|
29天前
|
JavaScript API 开发者
Vue是如何进行组件化的
Vue是如何进行组件化的
|
1月前
|
JavaScript 前端开发 开发者
vue 数据驱动视图
总之,Vue 数据驱动视图是一种先进的理念和技术,它为前端开发带来了巨大的便利和优势。通过理解和应用这一特性,开发者能够构建出更加动态、高效、用户体验良好的前端应用。在不断发展的前端领域中,数据驱动视图将继续发挥重要作用,推动着应用界面的不断创新和进化。
|
5天前
|
JavaScript 关系型数据库 MySQL
基于VUE的校园二手交易平台系统设计与实现毕业设计论文模板
基于Vue的校园二手交易平台是一款专为校园用户设计的在线交易系统,提供简洁高效、安全可靠的二手商品买卖环境。平台利用Vue框架的响应式数据绑定和组件化特性,实现用户友好的界面,方便商品浏览、发布与管理。该系统采用Node.js、MySQL及B/S架构,确保稳定性和多功能模块设计,涵盖管理员和用户功能模块,促进物品循环使用,降低开销,提升环保意识,助力绿色校园文化建设。
|
1月前
|
JavaScript 前端开发 开发者
vue学习第一章
欢迎来到我的博客!我是瑞雨溪,一名热爱前端的大一学生,专注于JavaScript与Vue,正向全栈进发。博客分享Vue学习心得、命令式与声明式编程对比、列表展示及计数器案例等。关注我,持续更新中!🎉🎉🎉
37 1
vue学习第一章
|
1月前
|
JavaScript 前端开发 索引
vue学习第三章
欢迎来到瑞雨溪的博客,一名热爱JavaScript与Vue的大一学生。本文介绍了Vue中的v-bind指令,包括基本使用、动态绑定class及style等,希望能为你的前端学习之路提供帮助。持续关注,更多精彩内容即将呈现!🎉🎉🎉
29 1