Vue3和Vue2的区别

2023-11-05

目录

前言

概览

一、新特性

二、差异

详情

一、vue3新特性

1、组合式API---setup

2、ref创建响应式数据

3、Teleport---“传送门”

4、多根节点

5、style中使用变量

二、区别

1、v-if和v-for的优先级

2、.sync修饰符

3、全局API

4、Vue.prototype 替换为 config.globalProperties

5、生命周期

6、key在template和v-if上的使用

7、$listeners被移除

8、this

9、typescript支持


前言

随着vue3在2022 年 2 月 7 日被提升为新的默认版本,这也将成为一个新的潮流,我们前端开发者也将在未来的工作中更多的使用vue3来搭建以及开发我们的项目。因此了解vue3和vue2的区别也就成为了一件至关重要的事情了。

概览

一、新特性

1、组合式API---setup

2、ref创建响应式数据

3、Teleport---“传送门”

4、多根节点

5、style中使用变量

二、差异

1、v-if和v-for的优先级

2、.sync修饰符

3、全局API

4、Vue.prototype 替换为 config.globalProperties

5、生命周期

6、key在template和v-if上的使用

7、$listeners被移除

8、this

9、typescript支持

详情

一、vue3新特性

1、组合式API---setup

  • 在vue2中:生命周期、methods、data等只能定义一次,并把相关的变量、方法等集中写在一处地方,这导致我们在代码编写及维护的过程中,不可避免的要反复横跳来查找对应的变量、方法等,这种碎片化的编码方式既不利于理解,也不利于维护
  • 在vue3中:setup是一个接收 props 和 content 的函数,允许我们在其内部通过API的方式(如:onMounted(getUserRepositories) // 在 `mounted` 时调用 `getUserRepositories`)多次使用一个相同的生命周期等。

2、ref创建响应式数据

  • 在vue2中:响应式数据的创建必须是写在 data 中的,在vue内部通过Object.defineproperty() 方法 以及 重写Array的方法来达到数据响应式的目的,这种方式是“主动”的,无论此变量有没有改变都会在vue初始化时设置为响应式(效率差,支持性差:你经常会用到$set这个方法)
  • 在vue3中:通过 ref 函数实现数据响应式(vue3中数据响应式的实现是通过proxy代理的方式,这种方式是“被动”的,只有当你去访问改变变量时,才会被处理为响应式数据,并且不需要对数组、对象等进行特殊处理,它是“一视同仁的”,还支持 Set 等较新的数据类型)

3、Teleport---“传送门”

  • 允许我们将指定内容渲染在指定的html标签上

4、多根节点

  • 在vue2中:一旦根节点有多个,vue会发出警告
  • 在vue3中:支持多根节点(减少了DOM元素的嵌套层级)

5、style中使用变量

  • <script setup>
    const theme = {
      color: 'red'
    }
    </script>
    <template>
      <p>hello</p>
    </template>
    <style scoped>
    p {
      color: v-bind('theme.color');
    }
    </style>

二、区别

1、v-if和v-for的优先级

  • 在vue2中:当v-if和v-for同时使用时,v-for的优先级高于v-if(因此我们通常需要计算属性先对数据进行加工处理,以达到性能优化的目的)
  • 在vue3中:当v-if和v-for同时使用时,v-if的优先级高于v-for

2、.sync修饰符

  • vue2中:由于vue中是单向数据流,父子组件在传值时想要实现v-model的效果就要用到.sync修饰符来实现“双向绑定”
  • vue3中:对v-model进行了改造,不再需要 .sync 修饰符即可达到数据双向绑定的效果。在vue3中支持多个 v-model属性,默认使用 modelValue 作为 prop,update:modelValue作为事件,当多个v-model绑定时,书写为例:v-model:title="title",此时 title 作为prop,update:title 作为事件

3、全局API

  • vue2中:有许多的全局API,如:Vue.directive、Vue.component、Vue.config、Vue.mixin等
  • vue3中:提供的是实例API,通过createApp创建vue实例,原来在Vue原型上的API都被挂载到了vue实例上,如:app.directive、app.component、app.config、app.mixin等

4、Vue.prototype 替换为 config.globalProperties

  • vue2中:绑定全局的变量、方法等:Vue.prototype.$ajax = xxxx
  • vue3中:const app = createApp({}); app.config.globalProperties.$ajax = xxxx

5、生命周期

vue2 vue3

beforeCreate

setup()

created

setup()

beforeMount

onBeforeMount

mounted

onMounted

beforeUpdate

onBeforeUpdate

updated      

onUpdated

beforeDestroy

onBeforeUnmount
destroyed  onUnmounted

6、key在template和v-if上的使用

  • vue2中:在使用v-if、vi-else、v-else-if时,为了保证dom节点渲染的正确性,通常需要在对应的节点添加不同的key,以确保vue在进行虚拟dom对比时是准确的;vue2中template在v-for循环时是不能设置key的,否则会产生警告(需要给子节点设置key)。
  • vue3中:在使用v-if、vi-else、v-else-if时,不用提供唯一的key对dom节点进行区分,因为vue内部会自动生成唯一的key,如果你提供了key,那你就要保证它的唯一性;vue3中template在v-for循环时,key应该设置在template标签上

7、$listeners被移除

  • vue2中:使用$attrs访问传递给组件的属性,使用$listeners访问传递给组件的事件(需要结合inheritAttrs:false)。
  • vue3中:虚拟dom中,事件监听器仅仅是以on为前缀的属性

8、this

  • vue2中:无时无刻都要使用this
  • vue3中:因为setup函数的存在,所有的props、data等都不需要用this进行访问(vue3对vue2绝大多数是兼容的,如果你用了vue2相关的东西,那你还是需要像vue2一样书写)

9、typescript支持

  • vue2中:默认是不支持typescript的。
  • vue3中:支持使用typescript,使用typescript在构建大型项目时,能够很好的提高项目开发的质量。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Vue3和Vue2的区别 的相关文章

  • 如何将值发布到输入框中?

    Intro I would like to get the current time after clicking at click and POST the value into input text box Note 假设包含引导样式表
  • 有没有办法动态更改 jqGrid 的单元格值?

    这个问题可能已经被问过很多次了 但我想知道是否可以动态更改 jqgrid 的单元格值 我基本上有一个网格 它通过 JSON 字符串加载数据 在特定列的某些行上 该值可能为 null 因此 预先知道哪个行 ID 是一个问题 然后能够将 nul
  • 如何在React Native的MapView中设置标记

    我想在React Native中的MapView上设置一个标记 但是通过官方文档找不到任何信息MapView https facebook github io react native docs mapview html content 如
  • 以下文档我无法创建 Vue.js 3 的实例

    The code https stackblitz com edit vue ttt file src main js https stackblitz com edit vue ttt file src main js 问题 我正在尝试在
  • 如何将 Ajax.BeginForm MVC 助手与 JSON 结果一起使用?

    我正在尝试使用 ASP NET MVC Ajax BeginForm 帮助程序 但不想在调用完成时使用现有的内容插入选项 相反 我想使用自定义 JavaScript 函数作为回调 这可行 但我想要的结果应该以 JSON 形式返回 不幸的是
  • Vuetify:v-ripple 只能用于块级元素

    我今天刚开始收到此错误 它破坏了我的整个网站 因为我像个傻瓜一样在页面加载时加载 Vuetify 有谁知道这意味着什么或如何解决它 谷歌搜索没有发现任何有用的信息 Edit 对于因网站也损坏而发现此问题的任何人 这可能是因为您加载的位置vu
  • Javascript 作为对象键的函数与块中标记函数之间的语法冲突

    假设您有一个支持两者的浏览器带标签的函数声明 https developer mozilla org en US docs Web JavaScript Reference Statements label Labeled function
  • 使用 jQuery inputmask 插件范围 0-100

    如何创建 0 到 100 范围内的掩码 document ready function masked inputmask 您可以使用jquery inputmask regex extensions js为了那个原因 你可以找到带有所有扩展
  • Apache Thrift Java-Javascript 通信

    我正在编写一个基于 Apache Thrift 的 Java 服务器 它将从 Javascript 客户端接收数据 我已经完成了 Java 服务器 但问题是我可以获得 Javascript 客户端的工作示例 我无法找到一个好的示例 构建文档
  • 正则表达式中连字符的这种用法有效吗?

    NB I only想知道它是否是正则表达式定义中未转义连字符的有效应用 它是not关于匹配电子邮件 连字符或反斜杠的含义 量词或其他任何内容的问题 另外 请注意 链接的答案并没有真正讨论转义 未转义连字符之间的有效性问题 通常我会像这样声明
  • 使用javascript以编程方式触发iOS safari中的复制菜单?

    我正在尝试实现一种用户友好的方式 将一些文本从文本输入字段复制到 iOS Safari 上的剪贴板 我知道无法在这个平台上以编程方式完成此操作 但我希望能够尽可能地指导用户体验 在 iOS Safari 上 当用户手动突出显示某些文本时 会
  • 如何显示接下来的三个图像单击加载更多按钮

    我需要一个加载更多按钮来显示图像 页面加载时 我显示 3 个图像 单击 加载更多 按钮后 接下来的 3 个图像将显示在屏幕上 我尝试了下面的代码 但它不起作用 你能帮我解决这个问题吗 function item slice 0 2 show
  • 可以禁用幻灯片的触摸模拟但不能禁用滚动条(危险的滑动器)吗?

    我的页面上有一个危险的滑动器 它成功地模拟了幻灯片和随附滚动条上的触摸事件 允许单击鼠标并移动以向左或向右滑动幻灯片 这很好 但我现在在滑动器内的幻灯片上调用了可拖动 这意味着我需要停止此触摸模拟 拖动幻灯片并同时移动它们会引起混乱 但仅限
  • Angular2:动态同步http请求

    Goal 发出一系列同步 http 请求并能够将它们作为一个可观察流进行订阅 示例 不工作 let query arr test1 test2 test3 function make request query arr if query a
  • 如何知道 .keyup() 是否是字符键(jQuery)

    如何知道 keyup 是否是字符键 jQuery input keyup function if key is a character such as a b A b c 5 3 2 etc not enter key or shift o
  • 如何从 CSS 选择器中提取类名?

    故事 我目前正在构建一个 ESLint 规则 以警告在 CSS 选择器定位器中使用引导布局导向和角度技术类 目前我在字符串方法中使用简单的子字符串 for var i 0 i lt prohibitedClasses length i if
  • Firebase + Node.js:错误:找不到 XMLHttpRequest 兼容性库

    Firebase Node js On iOS 安装的 Node js npm 安装 firebase save 节点测试 js 其中 test js 是一个非常简单的连接到 Firebase 的脚本 var firebase requir
  • 如何将MathJax公式转换为img

    Mathjax 现在在我的项目中运行良好 但有一个问题 有没有办法将MathJax的公式 纯html和css 转换成img文件 我可以保存 MathJax 可以配置为生成 SVG 看http docs mathjax org en late
  • onPress 方法中箭头函数与普通函数的行为

    正在学习 Native React 并学习更多关于 javascript 的知识 所以我仍然不明白它的行为的很多事情 我使用 TouchableOpacity 及其 onPress 属性创建了一个按钮组件 为了让它工作 我必须发送我想要执行
  • Three.js点击单个粒子

    In this example http jsfiddle net agqq96bq 2 您可以看到 2 个可点击的粒子 但它们都受到点击的影响 另外 我只想检测粒子上的点击 而不将它们过滤出场景 像这儿 if intersects len

随机推荐