Vue3.0和2.0语法不同分析

news2024/11/24 6:31:36

前言:本篇文章只做VUE3.0和VUE2.0语法上的不同分析,不做性能和源码架构等的分析。

一、VUE3.0和VUE2.0代码结构不同

VUE3.0代码实例

<template>
  <div>
    <span>count is {{ count }}</span>
    <span>plusOne is {{ plusOne }}</span>
    <button @click="increment">count++</button>
  </div>
</template>
 
<script>
import { value, computed, watch, onMounted, ref } from 'vue'
 
export default {
  setup() {
    // ref state
    const count = ref(0)
    // computed state
    const plusOne = computed(() => count.value + 1)
    // method
    const increment = () => { count.value++ }
    // watch
    watch(() => count.value * 2, val => {
      console.log(`count * 2 is ${val}`)
    })
    // lifecycle
    onMounted(() => {
      console.log(`mounted`)
    })
    // expose bindings on render context
    return {
      count,
      plusOne,
      increment
    }
  }
}
</script>

也可以不用写setup函数,可以直接把setup写到script标签上
VUE3.0代码实例

<template>
  <div>
    <span>count is {{ count }}</span>
    <span>plusOne is {{ plusOne }}</span>
    <button @click="increment">count++</button>
  </div>
</template>

<script setup lang="ts">
import { computed, watch, onMounted, ref } from 'vue'

// ref state
const count = ref(0)
// computed state
const plusOne = computed(() => count.value + 1)
// method
const increment = () => { count.value++ }
// watch
watch(() => count.value * 2, val => {
  console.log(`count * 2 is ${val}`)
})
// lifecycle
onMounted(() => {
  console.log(`mounted`)
})

</script>

相应的VUE2.0代码实例

<template>
    <div>
        <span>count is {{ count }}</span>
        <span>plusOne is {{ plusOne }}</span>
        <button @click="increment">count++</button>
    </div>
</template>
 
<script>
    export default {
        data() {
            return {
                count: 0
            };
        },
        methods: {
            increment: function () {
                this.count++;
            }
        },
        computed: {
            plusOne: function () {
                return this.count + 1;
            }
        },
        watch: {
            count: function (val) {
                console.log(`count * 2 is ${val * 2}`)
            }
        },
        mounted() {
            console.log(`mounted`);
        }
    };
</script>

VUE2.0和VUE3.0的代码对比一下:VUE2.0是将mounted、data、computed、watch之类的方法作为VUE对象的属性进行导出。VUE3.0新增了一个名为setup的入口函数,value, computed, watch, onMounted等方法都需要从外部import
在这里插入图片描述

二、关于VUE3.0和VUE2.0生命周期

VUE2.0生命周期

1、beforeCreate:在实例初始化之后、进行数据侦听和事件/侦听器的配置之前同步调用
2、created:在实例创建完成后被立即同步调用。在这一步中,实例已完成对选项的处理,意味着以下内容已被配置完毕:数据侦听、计算属性、方法、事件/侦听器的回调函数。然而,挂载阶段还没开始,且 $el property 目前尚不可用。
3、beforeMount:在挂载开始之前被调用:相关的 render 函数首次被调用。
4、mounted:在实例挂载完成后被调用。
5、beforeUpdate:在数据发生改变后,DOM 被更新之前被调用。这里适合在现有 DOM 将要被更新之前访问它,比如移除手动添加的事件监听器。
6、updated:在数据更改导致的虚拟 DOM 重新渲染和更新完毕之后被调用。
7、activated:被 keep-alive 缓存的组件激活时调用。
8、deactivated:被 keep-alive 缓存的组件失活时调用。
9、beforeUnmount:在卸载组件实例之前调用。在这个阶段,实例仍然是完全正常的。
10、unmounted:卸载组件实例后调用。调用此钩子时,组件实例的所有指令都被解除绑定,所有事件侦听器都被移除,所有子组件实例被卸载。
在这里插入图片描述

VUE3.0生命周期

1、setup: 同VUE2.0的beforeCreate和created。
2、onBeforeMount:同VUE2.0的beforeMount。
3、onMounted:同VUE2.0的mounted。
4、onBeforeUpdate:同VUE2.0的beforeMount。
5、onUpdated:同VUE2.0的updated。
6、onBeforeUnmount:同VUE2.0的beforeUnmount。
7、onUnmounted:同VUE2.0的unmounted。
8、onMounted:同VUE2.0的beforeMount。
9、onActivated:同VUE2.0的activated。
10、onDeactivated:同VUE2.0的deactivated。

三、VUE3.0和VUE2.0响应式

VUE3.0响应数据
1、ref():让简单类型的数据变成响应式数据。这种数据是Number或者String等基本类型数据,这种数据是通过值而非引用传递的类型。

import { ref } from 'vue'

const count = ref(0)
console.log(count.value) // 0

count.value++
console.log(count.value) // 1

2、reactive(): 让复杂类型数据变成响应式,不需要.value包裹。

import { reactive } from 'vue'

// 响应式状态
const state = reactive({
  count: 0
})

state.count.value++
console.log(state.count) // 1

注意:当ref作为响应式对象的值被更改时,ref的内部值也会发生改变。

const count = ref(0)
const state = reactive({
  count
})

console.log(state.count) // 0

state.count = 1
console.log(count.value) // 1

注意:使用ES6解构响应式对象时,响应式会丢失。

import { reactive } from 'vue'

const book = reactive({
  author: 'Vue Team',
  year: '2020',
  title: 'Vue 3 Guide',
  description: 'You are reading this book right now ;)',
  price: 'free'
})

let { author, title } = book

对于这种情况,我们需要将我们的响应式对象转换为一组 ref。这些 ref 将保留与源对象的响应式关联,使用toRefs():

import { reactive, toRefs } from 'vue'

const book = reactive({
  author: 'Vue Team',
  year: '2020',
  title: 'Vue 3 Guide',
  description: 'You are reading this book right now ;)',
  price: 'free'
})

let { author, title } = toRefs(book)

title.value = 'Vue 3 Detailed Guide' // 我们需要使用 .value 作为标题,现在是 ref
console.log(book.title) // 'Vue 3 Detailed Guide'

watch监听属性
VUE3.0 watch监听

import { ref, watch } from 'vue'

const counter = ref(0)
watch(counter, (newValue, oldValue) => {
  console.log('The new counter value is: ' + counter.value)
})

VUE2.0 watch监听

export default {
  data() {
    return {
      counter: 0
    }
  },
  watch: {
    counter(newValue, oldValue) {
      console.log('The new counter value is: ' + this.counter)
    }
  }
}

computed计算属性
VUE3.0 computed计算

import { ref, computed } from 'vue'

const counter = ref(0)
const twiceTheCounter = computed(() => counter.value * 2)

counter.value++
console.log(counter.value) // 1
console.log(twiceTheCounter.value) // 2

VUE2.0 computed计算

Vue.createApp({
  data() {
    return {
      counter: 0
    }
  },
  computed: {
    twiceTheCounter() {
      return counter * 2
    }
  }
}).mount('#demo')

父子组件通过props传递值
VUE3.0 props

// MyBook.vue
export default {
  props: {
    title: String
  },
  setup(props) {
    console.log(props.title)
  }
}

或者

<script setup>
const props = defineProps({
  title: {
    type: String
  }
})
</script>

VUE2.0 props

export default {
  name: 'Demo',
  props: {
    count: {
      type: Number,
      default: 1
    },
   arrValue: {
      type: Array,
      default () {
        return []
      }
    }
  },
  mounted() {
    console.log(this.count)
  }
 }

emit子组件向父组件抛出事件

VUE2.0
VUE2.0可以通过this.$emit()向父组件抛出事件

VUE3.0

setup(props, { emit }) {
    const close = ()=>{
        emit("change")    
    }
    return{
        close
    }
}

或者

<script setup>
const emit = defineEmits(["change"])

const close = ()=>{
        emit("change")    
    }
</script>

$refs

VUE2.0
vue2.0可以直接通过this.$refs.访问子组件

VUE3.0

<template>
  <div ref="refDemo" />
</template>
<script setup>
const refDemo = ref()
console.log(refDemo.value)
</script>

注意:1、通过变量的命名要和ref相同。 2、通过ref来访问子组件的方法,子组件要通过expose将事件和变量暴露出来,这样父组件才能访问到

VUE3.0 context
VUE2.0
VUE2.0可以通过this来访问VUE实例上的方法和变量。例如this.emit、this.refs、this.$slots

VUE3.0
context 是一个普通 JavaScript 对象,暴露了其它可能在 setup 中有用的值:

export default {
  setup(props, context) {
    // Attribute (非响应式对象,等同于 $attrs)
    console.log(context.attrs)

    // 插槽 (非响应式对象,等同于 $slots)
    console.log(context.slots)

    // 触发事件 (方法,等同于 $emit)
    console.log(context.emit)

    // 暴露公共 property (函数)
    console.log(context.expose)
  }
}

注意:在setup时,你只能访问props、attrs、slots、emit。无法访问data、computed、methods、refs (模板 ref)
更多内容可以看官方文案官方地址

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

AH8691-60V降压至3.3V电源芯片:ESOP8封装解决方案

AH8691-60V降压至3.3V电源芯片&#xff1a;ESOP8封装解决方案 随着电子设备的日益普及&#xff0c;电源管理芯片的重要性也日益凸显。一款高效率、低功耗的电源芯片可以大大提高电子设备的性能和可靠性。今天&#xff0c;我们将介绍一款60V降压至3.3V电源芯片&#xff0c;采用…

c++递归分析出依赖的头文件

我想使用boost::optional&#xff0c;但boost库太大&#xff0c;添加到git时比较费劲。 怎样分析出boost/optional.hpp依赖的头文件&#xff0c;然后精准地添加到git上呢&#xff1f; 使用g就可以了&#xff0c;步骤如下 进入目录boost_1_78_0/boost执行 g -MM -H optional.hp…

04-快速掌握Redis,了解Redis中常见的结构类型及其应用场景

Redis快速入门 Remote Dctionary Server Redis是用C语言开发的一个开源的、基于内存的(高性能)键值对(key-value)结构化NoSql数据库,每秒内查询次数可以达到100000的QPS 键值型: Redis中存储的数据都是以key、value对的形式存储&#xff0c;而value的形式多种多样(如字符串、…

低代码,让我效率提升了80%

目录 ​编辑 一、前言 二、优势 三、主要功能点 四、低代码归根结底差不多 五、小结 一、前言 低代码开发平台&#xff0c;一个号称能在几分钟的时间里开发出一套公司内部都可使用的应用系统开发工具。很多人或许都隐隐听说过低代码&#xff0c;因为低代码不仅远名国外&#xf…

003 OpenCV filter2D

目录 一、环境 二、图像卷积 三、代码演示 3.1、锐化 3.2、sobel边缘&#xff0c;x方向 3.3、sobel边缘&#xff0c;y方向 3.4、高斯模糊 3.5、完整代码 一、环境 本文使用环境为&#xff1a; Windows10Python 3.9.17opencv-python 4.8.0.74 二、图像卷积 在OpenCV…

CentOS停服背景下“浪潮信息KeyarchOS(KOS)系统迁移(无缝切换)解决方案”

1 前言 1.1 背景介绍 CentOS停服事件源于2020年12月宣布的CentOS项目变更&#xff0c;其原计划是基于Red Hat Enterprise Linux&#xff08;RHEL&#xff09;的开源版本&#xff0c;提供长期支持。然而&#xff0c;在2020年12月8日&#xff0c;官方宣布终止CentOS Linux的项目…

【数学】正投影和仿射投影

正投影 (Orthographic projection) Weak perspective projection Affine projection 形式1 形式2

BGP引入实验,华为ensp模拟器

一个小作业题&#xff0c;中间三台路由器bgp 100 分支用rip和ospf&#xff0c;最后如有引入时通过前缀列表精确匹配和路由策略调用&#xff0c;都是一些基本配置&#xff0c;考研学生们的基本功扎不扎实&#xff0c;从最最基础的接口配ip&#xff0c;到igp的路由配置&#xff0…

独立站和跨境电商平台的一个优缺点对比,哪个更适合你?

不管哪个行业都是一样的&#xff0c;有优点也有缺点&#xff0c;就像人们常说的人无完人一样。然后&#xff0c;我们来说说最近比较受关注的跨境电商独立站和跨境电商平台的一个优缺点对比吧&#xff01; 了解跨境电商独立站 建站&#xff0c;测试模板网站 跨境电商独立站 优点…

早上好图片漂亮祝福语,祝你事业芝麻节节高,好运连连天天妙!

1、清晨&#xff0c;我呼吸着新鲜空气&#xff0c;迎面的风捎来了你的气息&#xff0c;不知你现在在哪里&#xff1f;希望在这美丽的早晨时时见到开开心心的你&#xff0c;早安&#xff01; 2、无论岁月如何变幻&#xff0c;不变的是心态&#xff0c;改变的是容颜&#xff0c;…

阿里云CentOS主机开启ipv6

目录 一、云主机开启和使用 ipv6 1、网络和交换机开启 ipv6 2、创建 / 编辑云主机&#xff0c;开启ipv6 3、安全组放行ipv6端口 二、使用 ipv6 地址进行 ssh 连接 三、ipv6 地址绑定域名 一、云主机开启和使用 ipv6 1、网络和交换机开启 ipv6 进入网络、交换机详情页面…

低代码是“银弹”,还是“毒弹”?

目录 1.Pro Code 真的更“香”吗&#xff1f; 门槛高 跨界难 代码编写只是第一步 2.Low Code 银弹论合理吗&#xff1f; Pro Code和Low Code的差异&#xff1a; 3.写在最后 “低代码”接力“中台”燃起了熊熊之火&#xff0c;引发了众多业内人士论战。有人认为低代码是毒瘤&…

使用FP8加速PyTorch训练

现代的人工智能硬件架构(例如&#xff0c;Nvidia Hopper, Nvidia Ada Lovelace和Habana Gaudi2)中&#xff0c;FP8张量内核能够显著提高每秒浮点运算(FLOPS)&#xff0c;以及为人工智能训练和推理工作负载提供内存优化和节能的机会。 在这篇文章中&#xff0c;我们将介绍如何修…

DBeaver 23.2.4发布

导读DBeaver 23.2.4发布,修复和添加了一些新功能。 SQL 编辑器 为更新语句添加了代码自动补全功能修复了智能补全和替换带引号表达式的问题删除了日志中首次打开 SQL 编辑器时出现的多余错误 数据库导航器 添加了过滤对象可视化功能修复了脚本文件夹打开问题 数据传输 正确…

消除“数据烟囱”,瓴羊港如何打破壁垒将多数据融通成大数据?

作为数字经济时代的“新石油”&#xff0c;数据已成为重要的生产要素。阿里巴巴副总裁、瓴羊CEO朋新宇认为&#xff0c;目前正处在数据流通变革的时代&#xff0c;其中最核心的问题是如何破解数实融合发展的堵点。数据流通中最重要的原则是&#xff0c;不流通无价值&#xff0c…

echarts 实现同一组legend控制两个饼图示例

实现同一组legend控制两个饼图示例&#xff1a; 该示例有如下几个特点&#xff1a; ①饼图不同值实现分割 ②实现tooltip自定义样式&#xff08;echarts 实现tooltip提示框样式自定义-CSDN博客&#xff09; ③自定义label内容 ④不同值颜色渐变 代码如下&#xff1a; this.o…

html实现图片裁剪处理(附源码)

文章目录 1.设计来源1.1 主界面1.2 裁剪界面 2.效果和源码2.1 动态效果2.2 源代码 源码下载 作者&#xff1a;xcLeigh 文章地址&#xff1a;https://blog.csdn.net/weixin_43151418/article/details/134455169 html实现图片裁剪处理(附源码)&#xff0c;支持图片放大缩小&#…

Linux下安装部署redis(离线模式)

一、准备工作 1.下载redis的安装包 下载地址&#xff1a;Index of /releases/ 大家可以自行选择redis的版本&#xff0c;笔者选择的是最新的 2.上传到服务器 前提是我先在服务器上创建了一个目录redis7.2.3&#xff0c;我直接上传到这个目录下 二、安装redis 1.解压redis t…

阿里云服务器ECS安装宝塔面板

前言 如今各种云服务器租借平台&#xff0c;例如腾讯云、阿里云之类的&#xff0c;很轻松的就能租借得到一台Linux的服务器。但是Linux的管理和使用存在一定的门槛。宝塔面板作为一款流行的服务器管理软件&#xff0c;提供了简单易用的图形化界面和丰富的管理功能&#xff0c;降…