面试官:vue2和vue3的区别有哪些

目录

多根节点,fragment(碎片)

Composition API

reactive 函数是用来创建响应式对象

Ref

toRef

toRefs

去除了管道

v-model的prop 和 event 默认名称会更改

vue2写法

Vue 3写法

vue3组件需要使用v-model时的写法

其他语法

1. 创建应用实例

2. 组件注册

3. 全局 API

4. 生命周期钩子

5. 计算属和监听器


多根节点,fragment(碎片)

熟悉 Vue2 的朋友应该清楚,在模板中如果使用多个根节点时会报错,如下所示。

// vue2中在template里存在多个根节点会报错
<template>
  <header></header>
  <main></main>
  <footer></footer>
</template>

// 只能存在一个根节点,需要用一个<div>来包裹着
<template>
  <div>
    <header></header>
    <main></main>
    <footer></footer>
  </div>
</template>

但是,Vue3 支持多个根节点,也就是 fragment。即以下多根节点的写法是被允许的。

<template>
  <header></header>
  <main></main>
  <footer></footer>
</template>

Composition API

Vue2 是选项API(Options API),一个逻辑会散乱在文件不同位置(data、props、computed、watch、生命周期钩子等),导致代码的可读性变差。当需要修改某个逻辑时,需要上下来回跳转文件位置。

Vue3 组合式API(Composition API)则很好地解决了这个问题,可将同一逻辑的内容写到一起,增强了代码的可读性、内聚性,其还提供了较为完美的逻辑复用性方案。

reactive 函数是用来创建响应式对象

Vue 3 中的 reactive 函数是用来创建响应式对象的,它将普通的 JavaScript 对象转换成 Vue 响应式的对象。下面是一个简单的例子,演示如何使用 reactive

Ref

reactive 只能给对象,数组添加响应式,如果想给值类型( string ,Number,Boolean ,Symbol )添加响应式,就要用到ref。

  • 获取数据值的时候需要加.value。
  • 参数可以传递任意数据类型,传递对象类型时也能保持深度响应式,所以适用性更广。
  • vue 3.0 setup里定义数据时推荐优先使用ref,方便逻辑拆分和业务解耦。
import { ref } from 'vue'

// 为基本数据类型添加响应式状态
const name = ref('Neo')

// 为复杂数据类型添加响应式状态
const state = ref({
  count: 0
})

// 打印name的值
console.log(name.value)
// 打印count的值
console.log(state.value.count)

toRef

可以将一个响应式对象的某个属性转换成一个单独的响应式对象。当这个属性发生改变时,这个改变会被追踪,并且会触发视图更新。

import { reactive, toRef } from 'vue'

const state = reactive({
  count: 0
})

const countRef = toRef(state, 'count')

console.log(countRef.value) // 0

state.count++

console.log(countRef.value) // 1

toRefs

toRefs 是 Vue 3 中的工具函数,可以将一个响应式对象转换成一个由所有属性都为响应式对象的普通对象。当响应式对象中的某个属性发生改变时,这个改变会被追踪,并且会触发视图更新。

import { reactive, toRefs } from 'vue'

const state = reactive({
  count: 0,
  message: 'Hello'
})

const refs = toRefs(state)

console.log(refs.count.value) // 0
console.log(refs.message.value) // 'Hello'

state.count++
state.message = 'World'

console.log(refs.count.value) // 1
console.log(refs.message.value) // 'World'

reactive封装的响应式对象,不要通过解构的方式return,这是不具有响应式的。可以通过 toRefs 处理,然后再解构返回,这样才具有响应式

<template>
  <div>
    <div>姓名:{{name}}</div>
    <div>年龄:{{age}}</div>
  </div>
</template>

<script>
import { reactive, toRefs } from 'vue'
export default {
  setup () {
    const state = reactive({
      age: 20,
      name: '太凉'

    })

    const stateAsRefs = toRefs(state)
    return {
      ...stateAsRefs
    }
  }
}
</script>

去除了管道

Vue 3 之前的版本中提供了管道(pipe)的功能,可以通过在模板中使用 | 符号来对表达式的结果进行处理。例如:

<template>
  <div>{{ message | capitalize }}</div>
</template>

<script>
export default {
  data() {
    return {
      message: 'hello world'
    }
  },
  filters: {
    capitalize(value) {
      if (!value) return ''
      value = value.toString()
      return value.charAt(0).toUpperCase() + value.slice(1)
    }
  }
}
</script>

在上面的代码中,我们使用管道将 message 变量的值转换为大写形式。

然而,Vue 3 中已经移除了管道的功能。这是因为管道的实现方式会带来一些性能问题。每个管道都会创建一个新的函数,这会导致更多的函数创建和执行,而这些函数可能只是对数据进行了一些简单的操作,这些操作完全可以在组件中使用计算属性或方法来完成。

在 Vue 3 中,推荐使用计算属性或方法来完成管道的功能。例如,在上面的代码中,我们可以将 capitalize 过滤器的功能封装到一个计算属性或方法中,然后在模板中使用这个计算属性或方法来对数据进行处理。这样可以避免创建多余的函数,提高应用的性能。 

v-model的prop 和 event 默认名称会更改

  • prop:value->modelValue
  • event :input=> update:modelValue

vue2 写法

<KyrieInput v-model="name" />
<!-- 不同的写法,相同的本质 -->
<KyrieInput :value="name" @input="name = $event" />

//如果想要改变 v-model 绑定的属性或者事件,需要在子组件内添加一个 model :
// KyrieInput.vue
export default {
    model: {
        prop: 'title',
        event: 'change',
    },
}

//经过上面的改造,现在 KyrieInput 这个组件 v-model 的本质变成了下面这样:
<KyrieInput :title="name" @change="name = $event" />

//实现组件属性的双向绑定
this.$emit('update:title', '关注我的你很酷');

//然后在父组件监听这个事件:
<KyrieInput :title="name" @update:title="name = $event" />

//方便起见,.sync 修饰符应运而生:
<KyrieInput :title.sync="name" />

Vue3 写法

<KyrieInput v-model="name" />
<!-- 这两行其实是一样的 -->
<KyrieInput :modelValue="name" @update:modelValue="name = $event" />

//如果要改变绑定的属性名,只需要给 v-model 传递一个参数就好了:
<KyrieInput v-model:title="name" />
<!-- 等同于 -->
<KyrieInput :title="name" @update:title="name = $event" />

//这个写法还彻底代替了 .sync 修饰符,并且支持统一组件绑定多个 v-model:
<KyrieInput v-model:title="name" v-model:content="info" />
<!-- 相当于 -->
<KyrieInput
    :title="name"
    @update:title="name = $event"
    :content="info"
    @update:content="info = $event"
/>

vue3组件需要支持v-model时的写法

在 Vue 3 中,我们需要在组件上使用 v-model 指令时,需要同时指定一个名为 modelValue 的 prop 和一个名为 update:modelValue 的事件。例如:

<template>
  <div>
    <input type="text" :value="modelValue" @input="$emit('update:modelValue', $event.target.value)">
    <p>{{ modelValue }}</p>
  </div>
</template>

<script>
  export default {
    props: {
      modelValue: {
        type: String,
        required: true
      }
    }
  };
</script>

其他语法

Vue 3 引入了一些新的特性和优化,同时也对一些 API 进行了调整和改进。以下是一些常见的 API 类型的比较:

1. 创建应用实例

Vue 2: new Vue(options)
Vue 3: createApp(options).mount(elementOrSelector)

2. 组件注册


Vue 2: Vue.component(name, options)
Vue 3: app.component(name, definition)

3. 全局 API


Vue 2: Vue.directive(name, definition)
Vue 3: app.directive(name, definition)

4. 生命周期钩子

vue2vue2中的生命周期

  • beforeCreate 组件创建之前
  • created 组件创建之后
  • beforeMount 组价挂载到页面之前执行
  • mounted 组件挂载到页面之后执行
  • beforeUpdate 组件更新之前
  • updated 组件更新之后

vue3vue3中的生命周期

  • setup 开始创建组件
  • onBeforeMount 组价挂载到页面之前执行
  • onMounted 组件挂载到页面之后执行
  • onBeforeUpdate 组件更新之前
  • onUpdated 组件更新之后

5. 计算属和监听器


Vue 2: computed: {}
Vue 3: computed()


Vue 2: watch: {}
Vue 3: watch()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/3473.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

提升网站性能:Nginx五种高效负载均衡策略

前言 本文收录于我是沐风晓月的csdn专栏《linux基本功-系统服务实战》&#xff0c; 关于nginx的系列后面会汇总起来&#xff0c;关注我&#xff0c;一起学习与成长。 本专栏写作的过程中&#xff0c;联合了csdn几位大佬&#xff0c;目前正在整理更新目录&#xff0c;力争让大…

多线程代码案例-阻塞队列

hi,大家好,今天为大家带来多线程案例--阻塞队列 这块知识点也很重要,要好好掌握呀~~~ &#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x1f338;&#x…

【蓝桥杯_练习】

蓝桥杯1.创建工程2.LED灯点亮led.c3.LCD液晶屏显示lcd.c4.定时器按键单机interrupt.hinterrupt.cman.c5.定时器&#xff08;长按键&#xff09;interrupt.hinterrupt.cmain.c6.PWMmain.c7.定时器-输入捕获&#xff08;频率&#xff0c;占空比测量&#xff09;interrupt.cmain.c…

中科亿海微FPGA应用(一、点灯)

1.软件&#xff1a; https://download.csdn.net/download/weixin_41784968/87564071 需要申请license才能使用&#xff1a;软件试用申请_软件试用申请_中科亿海微电子科技&#xff08;苏州&#xff09;有限公司 2.开发板&#xff1a; 芯片EQ6HL45&#xff0c;42.5k LUT。 3…

移植RK3568的串口

文章目录 前言一、代码位置二、硬件原理图三、修改设备树四、关闭串口调试功能总结前言 本文主要讲解如何移植RK3568的串口 提示:以下是本篇文章正文内容,下面案例可供参考 一、代码位置 drivers/tty/serial/8250/8250_core.c drivers/tty/serial/8250/8250_dma.c dma实现…

TCP协议详解

1.TCP的准备条件在古代的时候&#xff0c;古人们经常写书信进行交流&#xff0c;写书信的前提是你要知道这份信是要寄给谁在网络中&#xff0c;我们通过ip端口号找对目标对象&#xff0c;但是现在网站一般会对ip端口注册一个域名&#xff0c;所以我们一般就是对域名进行查找&am…

mysql的limit查询竟然有坑?

背景 最近项目联调的时候发现了分页查询的一个bug&#xff0c;分页查询总有数据查不出来或者重复查出。 数据库一共14条记录。 如果按照一页10条。那么第一页和第二页的查询SQL和和结果如下。 .png) 那么问题来了&#xff0c;查询第一页和第二页的时候都出现了11,12,13的记录…

又一款全新的基于 GPT4 的 Python 神器Cursor,关键还免费

chartgpt大火之后&#xff0c;随之而来的就是一大类衍生物了。 然后&#xff0c;今天要给大家介绍的是一款基于GPT4的新一代辅助编程神器——Cursor。 它最值得介绍的地方在于它免费&#xff0c;我们可以直接利用它来辅助我们编程&#xff0c;真正做到事半功倍。 注意&#…

大数据项目之数仓相关知识

第1章 数据仓库概念 数据仓库&#xff08;DW&#xff09;: 为企业指定决策&#xff0c;提供数据支持的&#xff0c;帮助企业&#xff0c;改进业务流程&#xff0c;提高产品质量等。 DW的输入数据通常包括&#xff1a;业务数据&#xff0c;用户行为数据和爬虫数据等 ODS: 数据…

十二届蓝桥杯省赛c++(下)

1、 拿到题目一定要读懂题意&#xff0c;不要看到这题目就上来模拟什么闰年&#xff0c;一月的天数啥的。这个题目问你当天的时间&#xff0c;就说明年月日跟你都没关系&#xff0c;直接无视就好了。 #include <iostream> #include <cstring> #include <algori…

Nginx 教程-动静分离

一、Nginx 动静分离理论1、概念今天学习和梳理Nginx动静分离&#xff0c;动静分离是将网站静态资源&#xff08;HTML&#xff0c;JavaScript&#xff0c;CSS&#xff0c;img等文件&#xff09;与后台应用分开部署&#xff0c;之所以要进行动静分离&#xff0c;其一为了提高前端…

Qt示例3:用Qt画一个温度计

示例1 以下是用Qt绘制一个简单的温度计的示例代码&#xff1a; #include <QPainter> #include <QWidget> #include <QApplication> class Thermometer : public QWidget { public:Thermometer(QWidget *parent 0); protected:void paintEvent(QPaintEvent …

戴眼镜检测和识别1:戴眼镜检测数据集(含下载链接)

戴眼镜检测和识别1&#xff1a;戴眼镜检测数据集(含下载链接) 目录 戴眼镜检测和识别1&#xff1a;戴眼镜检测数据集(含下载链接) 1. 前言 2.Eyeglasses-Dataset数据集说明 3.Eyeglasses-Dataset数据集下载 4.戴眼镜检测和识别&#xff08;Python版本&#xff09; 5.戴眼…

JavaWeb——线程安全问题的原因和解决方案

目录 一、线程不安全的原因 1、抢占式执行、随机调度 2、多线程同时修改同一个变量 3、修改操作不是原子的 4、内存可见性 5、指令重排序 二、解决方法 1、使用synchronized方法加锁 &#xff08;1&#xff09;、定义 &#xff08;2&#xff09;、使用 &#xff08;3…

Github ChatGPT-Web:了解最新AI技术的前沿应用!

近年来OpenAI的ChatGPT模型在自然语言处理领域取得了很大的进展&#xff0c;并且已经在全球范围内得到了广泛的应用和普及。ChatGPT不仅可以用于生成对话和文本摘要等任务&#xff0c;还可以用于机器翻译、问答系统、情感分析等多个领域。ChatGPT已经成为自然语言处理领域的一个…

基于51单片机的自动打铃打鸣作息报时系统AT89C51数码管三极管时钟电路

wx供重浩&#xff1a;创享日记 对话框发送&#xff1a;单片机打铃 获取完整无水印论文报告说明&#xff08;含源码程序、电路原理图和仿真图&#xff09; 本次设计中的LED数码管电子时钟电路采用24小时制记时方式,本次设计采用AT89C51单片机的扩展芯片和6个PNP三极管做驱动&…

【C语言蓝桥杯每日一题】——跑步锻炼

【C语言蓝桥杯每日一题】—— 跑步锻炼&#x1f60e;前言&#x1f64c;排序&#x1f64c;总结撒花&#x1f49e;&#x1f60e;博客昵称&#xff1a;博客小梦 &#x1f60a;最喜欢的座右铭&#xff1a;全神贯注的上吧&#xff01;&#xff01;&#xff01; &#x1f60a;作者简介…

使用chatGPT实现数字自增动画

num-auto-add&#xff1a;数字自增动画 序言 我们经常在一些好的网站上遇到数字自增的动画效果&#xff0c;为用户提供了更加丰富的交互体验&#xff0c;看起来非常酷。 我之前也有写过&#xff0c;为了方便以后使用&#xff0c;打算将它优化&#xff0c;并上传到npm中。 首…

OpenCV入门(二十一)快速学会OpenCV 20 图像金字塔

OpenCV入门&#xff08;二十一&#xff09;快速学会OpenCV 20 图像金字塔1.基本概念2.高斯金字塔2.1 向下取样2.2 向上取样3.拉普拉斯金字塔作者&#xff1a;Xiou 1.基本概念 一般情况下&#xff0c;我们要处理的是一幅具有固定分辨率的图像。有些情况下&#xff0c;我们需要…

RabbitMQ 入门到应用 ( 六 ) 消息可靠性

7.RabbitMQ可靠性投递 为了保证信息不丢失, 可靠抵达,引入确认机制 消息从生产者传递到消费者的过程中, 不同的阶段使用不同的确认方式. 7.0.准备请求 一次性发送10 个消息 通过 new.exchange.direct交换机 接收消息, 使用 new.admin路由键 向 new.admin队列 发送消息. Aut…