深入探索Vue3组合式API

目录

组合式API的好处

Vue3有哪些生命周期?

Vue2.X 和 Vue3.X对比

watch 和 watchEffect 的区别?

1.watch

2.watchEffect

watch和watchEffect的对比

ref 与 reactive 的区别?

定义

主要特点

基本用法

与 

组件定义

生命周期钩子


组合式API的好处

1.更好的逻辑组织:

在选项式API中,组件逻辑是按照data、methods、computed、watch等分块写的,这种分离可能会导致相同功能的代码分散在不同的部分

组合式API 通过将相关的逻辑组合在一起,使代码更加紧凑和清晰,尤其实在复杂组件中,组织代码的方式更加自然。

2.更好的逻辑复用:

在选项式API中,如果要复用逻辑,通常使用mixin,但mixin存在作用域不清晰、命名冲突等问题。

组合式API提供了composable (可组合函数)的概念,运行将逻辑抽取成独立的函数,这样复用性更强、代码更清晰。

3.更好的类型推断支持:

组合式API更好地支持TypeScript,尤其是在函数内部可以更明确地推断出数据和函数的类型,而不需要额外的类型定义。

4.更灵活的响应式系统:

组合式API 提供了更灵活的响应式系统,比如通过ref和reactive可以更直观地控制响应式数据的行为

Vue3有哪些生命周期?

  • setup():开始创建组件,在beforeCreate  和  created 之前进行, 创建的是 data 和 method
  • onBeforeMount():组件挂载到节点上之前执行的函数
  • onMounted():组件挂在完成后执行的函数;
  • onBeforeUpdate():组件更新之前执行的函数;
  • onUpdated():组件更新完成之后执行的函数;
  • onBeforeUnmount():组件卸载之前执行的函数;
  • onUnmounted():组件卸载完成后执行的函数;
  • onActived():被包含在<keep-alive>中的组件, 会多出两个生命周期钩子函数,被激活时执行;
  • onDeactivated():比如 A 组件切换到 B 组件,A组件消失时执行;
  • onErrorCaptured():当捕获一个来自子孙组件的异常时激活钩子函数。

Vue2.X 和 Vue3.X对比

vue2           ------->      vue3beforeCreate   -------->      setup(()=>{})
created        -------->      setup(()=>{})
beforeMount    -------->      onBeforeMount(()=>{})
mounted        -------->      onMounted(()=>{})
beforeUpdate   -------->      onBeforeUpdate(()=>{})
updated        -------->      onUpdated(()=>{})
beforeDestroy  -------->      onBeforeUnmount(()=>{})
destroyed      -------->      onUnmounted(()=>{})
activated      -------->      onActivated(()=>{})
deactivated    -------->      onDeactivated(()=>{})
errorCaptured  -------->      onErrorCaptured(()=>{})

watch 和 watchEffect 的区别?

1.watch

watch用于监听特定响应式数据的变化,并在数据变化时执行回调函数。下面是一个使用watch的例子:

import { ref, watch } from 'vue';const count = ref(0);watch(count, (newValue, oldValue) => {console.log(`Count changed from ${oldValue} to ${newValue}`);// 执行一些副作用操作,例如发送API请求、更新其他状态等
});// 改变count值会触发watch的回调
count.value++;
  • watch接受两个参数, 第一个参数是要监听的响应式值或计算属性(可以是ref、reactive对象的属性或者是computed的结果),第二个参数是回调函数。
  • 回调函数会在监听的值发生变化时被调用,它会接收到新的值和旧的值作为参数。
  • 如果你要深度监听对象或数组的变化, 可以为watch添加第三个参数,配置对象,如{deep:true}

2.watchEffect

watchEffect则是立即执行并且持续监听其内部依赖变化的函数。每当其依赖的响应式值发生变化时,它都会重新执行。

import { ref, watchEffect } from 'vue';const count = ref(0);
const message = ref('Initial Message');watchEffect(() => {console.log(`Count is ${count.value}, and message is ${message.value}`);// 根据count和message的值执行一些副作用操作
});// 改变count或message值都会触发watchEffect的再次执行
count.value++;
message.value = 'Updated Message';

详细讲解:

  • watchEffect不需要指定监听的具体值,它会自动追踪其内部表达式所涉及的所有响应式依赖。
  • 当调用watchEffect时,它会立即执行一次,并记录下内部依赖的快照,此后每当依赖项变化时,它会再次执行。
  • 若想停止监听,可以返回一个清理函数,例如在组件卸载时清理副作用。

watch和watchEffect的对比


watch

  • watch显式指定依赖数据,依赖数据更新时执行回调函数
  • 具有一定的惰性lazy 第一次页面展示的时候不会执行,只有数据变化的时候才会执行(设置immediate: true时可以变为非惰性,页面首次加载就会执行)
  • 监视ref定义的响应式数据时可以获取到原值
  • 既要指明监视的属性,也要指明监视的回调


watchEffect

  • watchEffect自动收集依赖数据,依赖数据更新时重新执行自身
  • 立即执行,没有惰性,页面的首次加载就会执行
  • 无法获取到原值,只能得到变化后的值
  • 不用指明监视哪个属性,监视的回调中用到哪个属性就监视哪个属性

ref 与 reactive 的区别?

定义

reactive 和 ref 是 Vue 3 中的两种响应式数据绑定方式,ref 适用于简单的响应式数据,而 reactive 则适用于复杂对象或数组的响应式数据。

ref:用于声明 基本类型 或者单个变量的响应式数据。

ref 的核心在于它包装了一个值,当这个值变化时,依赖它的视图会重新渲染。
注意:ref 返回的是一个对象,其中的值通过 .value 属性访问。

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


reactive:用于声明 对象 或 数组 的响应式数据。

reactive 更适合处理复杂的数据结构(对象或数组)。它返回的是一个响应式对象,直接操作对象的属性时,视图会自动更新。
 

const state = reactive({name: 'Vue',age: 3
});
console.log(state.name); // 'Vue'
state.age = 4; // 视图会自动更新

主要区别如下:

1. 数据类型不同:

ref用于包装JavaScript基本类型的数据(如字符串、数字、布尔值等)

reactive可以用于包装JavaScript对象和数组等复杂类型的数据


2. 使用方式不同:

ref需要通过在模板中使用ref指令以及在JavaScript代码中使用ref函数进行创建和使用,而reactive则需要通过调用Vue.js提供的reactive函数进行包装和创建。


3. 访问方式不同:

对于通过ref函数创建的响应式数据,我们可以通过.value属性来访问其实际值;而对于通过reactive函数创建的响应式对象,我们可以直接访问其属性或调用其方法


4. 设计理念不同:

ref主要是为了解决单一元素/数据的响应式问题,而reactive则是为了解决JavaScript对象和数组等复杂数据结构的响应式问题

<script setup>

<script setup> 是 Vue 3 引入的一种新语法糖,它用于使用组合式 API 编写组件。这种语法简化了 Composition API 的使用,使得编写和组织组件逻辑更加简洁和直观。

主要特点

  1. 声明式<script setup> 提供了一种声明式的方式来使用组合式 API,减少了样板代码。
  2. 自动响应:在 <script setup> 中定义的响应式引用(如 ref 和 reactive)和函数自动暴露给模板,无需返回对象。
  3. 生命周期钩子:生命周期钩子(如 onMountedonUpdated 等)可以直接导入和使用,无需定义匿名函数。
  4. 模块作用域:在 <script setup> 中导入的变量和函数自动拥有模块作用域,减少了全局命名冲突。

基本用法

<script setup>
import { ref, computed, onMounted } from 'vue';const count = ref(0);
const doubledCount = computed(() => count.value * 2);onMounted(() => {console.log('Component is mounted');
});function increment() {count.value++;
}
</script><template><div><p>Count: {{ count }}</p><p>Doubled Count: {{ doubledCount }}</p><button @click="increment">Increment</button></div>
</template>

与 <script> 的区别

  • 无需返回对象:在 <script setup> 中,你不需要返回一个对象来暴露响应式状态、计算属性和方法给模板。
  • 更少的代码<script setup> 使得组件的编写更加简洁,减少了样板代码。

组件定义

<script setup> 中,你可以定义组件的响应式状态、计算属性、方法和生命周期钩子,就像在 <script> 标签中使用组合式 API 一样,但是更加简洁。

生命周期钩子

<script setup>
import { onMounted } from 'vue';onMounted(() => {console.log('Component is mounted');
});
</script>

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

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

相关文章

openstack底层创建虚拟机快照和导出快照、浅谈dashboard中主机聚合和可用域的关系

文章目录 openstack底层创建虚拟机快照和导出快照说明获取虚拟机的uuid创建快照导出快照到本地浅谈dashboard中主机聚合和可用域的关系说明主机聚合可用域openstack底层创建虚拟机快照和导出快照 说明 为什么要到底层用命令创建虚拟机快照? 1、dashboard中直接创建快照失败;…

本田汽车投资SiLC Technologies:携手共促自动驾驶技术新飞跃

SiLC Technologies获本田汽车投资:加速自动驾驶技术革新 近日,硅谷光子学初创公司SiLC Technologies宣布获得本田汽车的投资,这一合作标志着双方将共同推进自动驾驶技术领域的革新与发展。本田此次投资不仅体现了对SiLC Technologies技术实力的认可,也彰显了本田在自动驾驶…

昇思学习打卡营第31天|深度解密 CycleGAN 图像风格迁移:从草图到线稿的无缝转化

1. 简介 图像风格迁移是计算机视觉领域中的一个热门研究方向&#xff0c;其中 CycleGAN (循环对抗生成网络) 在无监督领域取得了显著的突破。与传统需要成对训练数据的模型如 Pix2Pix 不同&#xff0c;CycleGAN 不需要严格的成对数据&#xff0c;只需两类图片域数据&#xff0c…

【网络】web1.0 2.0 3.0各自出现背景/技术原理/演化发展过程,以及Web 3.0 对传统互联网的影响

一、web1.0 2.0 3.0各自出现背景/技术原理/演化发展过程 互联网自诞生以来&#xff0c;经历了三个主要的发展阶段&#xff1a;Web 1.0、Web 2.0 和 Web 3.0&#xff0c;每个阶段都有其独特的特点和影响。 1、Web 1.0 Web 1.0 是互联网的初始阶段&#xff0c;大约从1990年代到…

IDEA:增加类注释模板和方法注释模板

文章目录 概要配置类注释模板配置方法模版 概要 配置类注释和方法注释 配置类注释模板 点击setting->Editor->File and Code Templates&#xff0c;然后找到Class&#xff0c;如下图&#xff1a; 注意勾掉Reformat according to style&#xff0c;否则会格式化。 注…

动态规划算法专题(四):子串、子数组系列

目录 1、最大子数组和 1.1 算法原理 1.2 算法代码 2、环形子数组的最大和 2.1 算法原理 2.2 算法代码 3、乘积最大子数组 3.1 算法原理 3.2 算法代码 4、乘积为正数的最长子数组长度 4.1 算法原理 4.2 算法代码 5、等差数列划分 5.1 算法原理 5.2 算法代码 6、…

COSPLAY大赛静态HTML网页模板源码

源码名称&#xff1a;COSPLAY大赛静态HTML网页模板 源码介绍&#xff1a;一款cosplay大赛HTML网页模板源码&#xff0c;过往参赛选手会自动从腾讯大赛获取&#xff0c;可用于cosplay大赛&#xff0c;漫展等。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.5188…

vue2路由和vue3路由区别及原理

一、Vue2 与 Vue3 路由的区别 1. 创建路由实例方式的不同 Vue 2 中&#xff0c;通过 Vue.use() 注册路由插件&#xff0c;并通过 new VueRouter() 来创建路由实例。 import Vue from vue;import VueRouter from vue-router;import Home from /components/Home.vue;​Vue.us…

如何减少网络安全事件的损失

为了减轻网络安全事件的损失&#xff0c;可以采取以下多项措施&#xff1a; 一、数据备份与恢复 定期备份数据&#xff1a;包括文件、数据库和系统映像等&#xff0c;确保在发生安全事件时&#xff0c;能够快速恢复数据和系统&#xff0c;从而减少损失。制定恢复计划&#xf…

k8s的控制节点不能访问node节点容器的ip地址

master控制node服务器添加容器后,访问不了该node服务器容器的ip,只能在node服务器访问 排查后发现是k8s的master服务器和node节点的网址网段和k8s初始化时提示的ip网段不一致 我之前是192.168.137.50, 实际上master主机期望的是192.168.1.50 解决方案: 1.删除服务器后重建ma…

使用iTextPDF库时,设置文字为中文格式

在使用iTextPDF库时&#xff0c;设置文字为中文格式主要涉及选择合适的中文字体&#xff0c;并确保该字体能够正确渲染中文字符。由于iTextPDF的内置字体通常不支持中文&#xff0c;因此你需要加载一个支持中文的字体文件&#xff08;如TrueType字体&#xff0c;.ttf文件&#…

SpringCloud入门(十二)全局过滤器和跨域

一、全局过滤器 全局过滤器的作用也是处理一切进入网关的请求和微服务响应&#xff0c;与GatewayFilter的作用一样。 区别在于GatewayFilter通过配置定义&#xff0c;处理逻辑是固定的&#xff0c;如果我们希望拦截请求&#xff0c;做自己的业务逻辑则没办法实现。而GlobalFilt…

【api连接ChatGPT的最简单方式】

通过api连接ChatGPT的最简单方式 建立client 其中base_url为代理&#xff0c;若连接官网可省略&#xff1b;配置环境变量 from openai import OpenAI client OpenAI(base_url"https://api.chatanywhere.tech/v1" )或给出api和base_url client OpenAI(api_key&…

英文论文安全的免费查重网站

关注B站可以观看更多实战教学视频&#xff1a;hallo128的个人空间 英文论文安全的免费查重网站 对于英文论文查重&#xff0c;以下是一些相对安全、且免费使用的查重网站推荐。不过请注意&#xff0c;免费工具通常只能提供基础查重功能&#xff0c;对于学术论文的全面查重&…

【AI大模型-文心-思维树解读-仓颉精通之路-11】

提问&#xff1a;你还记得我们设置过一个暗号吗&#xff1f;仓颉精通之路 回答&#xff1a;如下 版本&#xff1a;文心大模型3.5 是的&#xff0c;我记得我们之前设置过的“暗号”是“仓颉精通之路”。这个“暗号”可以被视为一个象征性的口号或指引&#xff0c;代表着我们在追…

VLAN 和 ARP 表

VLAN 和 ARP 表之间有着密切的关系&#xff0c;因为 ARP (地址解析协议) 用于在同一个二层广播域内将 IP 地址解析为 MAC 地址。VLAN 将一个物理局域网分割成多个逻辑局域网&#xff0c;每个 VLAN 都是一个独立的广播域。因此&#xff0c;ARP 表的作用范围被限制在每个 VLAN 内…

Redis:string类型

Redis&#xff1a;string类型 string命令设置与读取SETGETMSETMGET 数字操作INCRINCRBYDECRDECRBYINCRBYFLOAT 字符串操作APPENDSTRLENGETRANGESETRANGE 内部编码intembstrraw 在Redis中&#xff0c;字符串string存储的是二进制&#xff0c;以byte为单位&#xff0c;输入的二进…

Pikachu-Unsafe FileUpload-客户端check

上传图片&#xff0c;点击查看页面的源码&#xff0c; 可以看到页面的文件名校验是放在前端的&#xff1b;而且也没有发起网络请求&#xff1b; 所以&#xff0c;可以通过直接修改前端代码&#xff0c;删除 checkFileExt(this.value) 这部分&#xff1b; 又或者先把文件名改成…

java代理模式(动态代理、静态代理、需要实现类的JDK代理、不需要实现类的JDK动态代理、CGLIB代理)

静态代理简单使用 静态代理是代理模式的一种实现方式&#xff0c;它在编译时就已经确定了被代理对象和代理对象的关系。在静态代理中&#xff0c;需要手动创建一个代理类&#xff0c;该代理类与被代理对象实现相同的接口或继承相同的父类&#xff0c;并在代理类的方法中调用被…

C++基类构造器的自动调用

C基类构造器的自动调用 虽然基类的构造器和解构器不会被派生类继承&#xff0c;但它们会被派生类的构造器和解构器自动调用&#xff0c;今天我们用代码实证一下。 验证代码 源代码&#xff0c;仔细看注释内容&#xff1a; D:\YcjWork\CppTour>vim c2004.cpp #include &l…