vite+vue3+ts中watch和watchEffct的使用

news2024/11/17 1:45:13

vite+vue3+ts中watch和watchEffct的使用

本文目录

    • vite+vue3+ts中watch和watchEffct的使用
      • watch
        • ref
        • reactive
        • props
        • immediate
        • 组合监听
      • watchEffect
        • 单值多值侦听
        • 副作用
        • 停止监听

watch

vue官方文档:https://cn.vuejs.org/api/reactivity-core.html#watch
可以监听基础类型,整个对象,对象的某个属性

ref

对于基本数据类型(如字符串、数字),ref 提供了完整的响应式特性

对于对象,ref 也可以使其成为响应式,但 watch 默认不进行深度监听,需要手动指定 deep 选项

ref基础类型:直接监听,可获取新旧值

const num = ref(1);

const changeValue = function () {
  num.value++;
};

watch(num, (newValue, oldValue) => {
  console.log("监听变化", newValue, oldValue);
});
  • ref对象类型:需要显式开启深度监听,但是只能获取新值

需要使用深度监听,由于 JavaScript 对象和数组的引用特性,newValueoldValue 会指向相同的内存地址;因此,在数据变化后,newValueoldValue 是相同的

const count = ref({
  a: 1,
  b: 2,
});

const changeValue = function () {
  count.value.a ++;
};

// 不生效
watch(count, (newValue, oldValue) => {
  console.log("监听变化", newValue, oldValue);
});
// 生效,添加deep
watch(count, (newValue, oldValue) => {
  console.log('监听变化deep', newValue, oldValue)
}, { deep: true })

把watch的引用类型数据源浅拷贝了一份,即可完成对新旧值得获取(多层数据需要使用深拷贝)

watch(
  () => {
    return { ...count.value };
  },
  (newValue, oldValue) => {
    console.log("监听变化deep-return\n", newValue, oldValue);
  },
  { deep: true }
);
  • ref对象的单个属性

此时第一个参数是一个箭头函数

watch(() => count.value.a, (newValue, oldValue) => {
  console.log("监听变化ref单个\n", newValue, oldValue);
});
  • ref数组类型
const list = ref([1, 2, 3, 4, 6]);

const changeValue = function () {
  list.value[0] ++;
};

watch(
  list,
  (newValue, oldValue) => {
    console.log("监听变化list-deep\n", newValue, oldValue);
  },
  { deep: true }
);
  • ref对象数组类型
const list = ref([
  { a: 1, b: 1 },
  { a: 1, b: 1 },
]);

const changeValue = function () {
  list.value[0].a++;
};

watch(
  list,
  (newValue, oldValue) => {
    console.log("监听变化list-deep\n", newValue, oldValue);
  },
  { deep: true }
);

使用深拷贝获取旧值

watch(
  () => JSON.parse(JSON.stringify(list.value)),
  (newValue, oldValue) => {
    console.log("监听变化deep-return\n", newValue, oldValue);
  },
  { deep: true }
);
reactive

reactive 用于创建一个深层次的响应式对象

对于 reactive 对象,watch 默认执行深度监听

  • reactive对象整体:直接监听,只能获取到新值
const demo = reactive({
  name: "aaa",
  item: {
    name: "",
    num: 1,
  },
});

const changeValue = function () {
  demo.item.num++;
};

watch(demo, (newValue, oldValue) => {
  console.log("监听变化reactive\n", newValue, oldValue);
});
  • reactive对象单个属性
watch(() => demo.item.num, (newValue, oldValue) => {
  console.log("监听变化reactive单个\n", newValue, oldValue);
});
props

使用 getter 函数返回值的形式,默认不开启深度监听

  • 父组件
<WatchB :item="demo"></WatchB>

const demo = reactive({
  name: "aaa",
  num: 1,
  item: {
    name: "",
    num: 1,
  },
});
  • 子组件
const props = defineProps(["item"]);

const ite = ref();
ite.value = props.item;

watch(
  () => props.item,
  (newVal, oldVal) => {
    console.log(ite.value);
  },
  { deep: true }
);
immediate

默认情况下watch懒加载的,设置immediate: true时,会在初始化时立即执行回调函数

{ deep: true, immediate: true }
组合监听

在组合监听的情况下,Vue 需要明确知道是否需要对 reactive 对象进行深度监听,所以需要显式开启深度监听

第一个参数是一个数组

watch(
  [() => demo, num],
  ([newDemo, newNum], [oldDemo, oldNum]) => {
    console.log("watch 已触发: demo", newDemo, oldDemo);
    console.log("watch 已触发: num", newNum, oldNum);
  },
  { deep: true }
);

watchEffect

在 watchEffect 的回调中,任何访问的响应式引用都会被追踪,当这些引用的值发生变化时,watchEffect 的回调会自动重新执行

watchEffect 适用于需要自动追踪多个数据源的场景,如副作用操作,用于清理或重置副作用(如定时器、订阅等)

watchEffect默认初始时就会执行第一次,一旦运行就会立即监听,组件卸载的时候会停止监听

watchEffect 无法获取到变化前的值,只能获取变化后的值

vue官方文档:https://cn.vuejs.org/api/reactivity-core.html#watcheffect

单值多值侦听
const number = reactive({ count: 0 });

const countAdd = () => {
  number.count++;
};

watchEffect(()=>{
  console.log("新的值:", number);
})

watchEffect 本身不会进行深度监听,它只会自动跟踪其回调函数中所引用的响应式状态(通过 ref 或 reactive 创建的状态)的变化。如果在 watchEffect 中引用了一个 reactive 对象的某个属性,它只会在那个具体属性发生变化时触发

const demo = reactive({
  name: "aaa",
  num: 1,
  item: {
    name: "",
    num: 1,
  },
});

watchEffect(() => {
  console.log("demo-num的变化后的值\n", demo.item.num);
});

watchEffect 只会在 demo.item.num 发生变化时触发。对于 demodemo.num 的变化,watchEffect 不会响应,因为它没有被 watchEffect 的回调函数所引用

watchEffect(() => {
  console.log("demo的变化后的值\n", demo);
});
副作用
// 副作用
const v3 = ref(3)
watchEffect(()=>{
  const v = v3.value
  // 存在异步
  setTimeout(()=>{
    console.log(v,'timeout')
  },1000);
})
watchEffect(async onInvalidate=>{
  const v = v3.value
  // 存在异步
  const timeout = setTimeout(()=>{
    console.log(v,'timeout')
  },1000);
  onInvalidate(()=>{
    clearTimeout(timeout)
  })
})

重复执行会触发 onInvalidate,取消上一次的异步请求

停止监听
const stop = watchEffect(() => {
  console.log("name:", demo.item.num);
});

const stopWatchEffect = () => {
  console.log("停止监听");
  stop();
};

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

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

相关文章

使用Docker部署Python Flask应用的完整教程

一、引言 Docker是一种开源的容器化平台&#xff0c;可以将应用程序及其依赖项打包成一个独立的容器&#xff0c;实现快速部署和跨平台运行。本文将详细介绍如何使用Docker来部署Python Flask应用程序&#xff0c;帮助开发者更高效地构建和部署应用。 二、准备工作 在开始之前…

Linux CentOS 8(DHCP的配置与管理)

Linux CentOS 8&#xff08;DHCP的配置与管理&#xff09; 目录 一、项目介绍二、DHCP服务简介三、DHCP工作原理四、配置DHCP服务4.1 项目配置准备4.2 dhcpd配置文件框架与参数说明4.3 登录客户机验证4.4 客户端IP地址的释放与重新申请4.5 保留特定IP地址 一、项目介绍 当计算…

【C++】容器string的构造函数和迭代器

目录 1 什么是string 2 迭代器 2.1 迭代器的使用 2.2 auto关键字以及代码可读性 3 构造函数 1 什么是string 上图是C官网对于string的解释&#xff1a;string是表示字符序列的对象。 string本质是一个类&#xff0c;位于std的命名空间下&#xff0c;使用前需要包含头文件…

基于乌燕鸥算法优化概率神经网络PNN的分类预测 - 附代码

基于乌燕鸥算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于乌燕鸥算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于乌燕鸥优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要&#xff1a;针对PNN神经网络…

安全知识普及:什么是垃圾邮件和网络钓鱼欺诈

文章目录 什么是垃圾邮件&#xff1f;如何保护您自己免遭垃圾电子邮件和网络钓鱼侵害区分私人和公用电子邮件私人电子邮件公共电子邮件 使用反垃圾邮件过滤器推荐阅读 什么是垃圾邮件&#xff1f; 您的邮箱里经常会出现一些莫名其妙的邮件&#xff0c;而这就是电子形式的垃圾邮…

【STM32】CRC(循环冗余校验)

一、CRC的背景知识 1、什么是CRC (1)CRC&#xff08;Cyclic Redundancy Check&#xff09;&#xff0c;循环冗余校验 (2)什么是校验&#xff0c;为什么需要校验&#xff1a;数据传输&#xff0c;数据存储过程中需要使用到的 (3)什么是冗余&#xff1a;表示比实际上要传输的数据…

【Unity小技巧】图片使用的一些常见问题

文章目录 前言Button不规则按钮点击空白区域不响应点击事件1. 设置资源参数2. 代码设置按钮Image的alphaHitTestMinimumThreshold3. 解释&#xff1a;4. 效果 Unity Image 原图比例控制方法一 Preserve Aspect1. 设置勾选Preserve Aspect&#xff08;保持长宽比&#xff09;&am…

docker删除镜像命令

在Docker中删除镜像的命令是 docker rmi。这个命令用于删除一个或多个Docker镜像。使用这个命令时&#xff0c;你需要指定要删除的镜像的ID或名称。以下是一些常用的用法&#xff1a; 删除单个镜像&#xff1a; docker rmi [IMAGE_ID或REPOSITORY:TAG]例如&#xff0c;如果你知…

【OpenAI开发者大会,全新大模型它来了,价格大跌...】

继今年春天发布 GPT-4 之后&#xff0c;OpenAI 又创造了一个不眠夜。 过去一年&#xff0c;ChatGPT 绝对是整个科技领域最热的词汇。 北京时间 11 月 7 日凌晨 02:00&#xff0c;OpenAI 的首次 DevDay 开发者日活动正式开始。Keynote 主论坛环节由 Sam Altman 主讲并在油管现…

Reflect的作用,target,property,value,receiver代表啥

1.真的proxy let target {name:张三} let handler {get(target,property,receiver){console.log(1,target,2,property,3,receiver)return Reflect.get(target,property,receiver)},set(target,property,value,receiver){console.log(a,target,b,property,c,value,d,receiver)…

vue3安装vue-router

环境 node 18.14.2 yarn 1.22.19 windows 11 vite快速创建vue项目 参考 安装vue-touter 官网 yarn add vue-router4src下新建router文件夹&#xff0c;该文件夹下新建index.ts // router/index.ts 文件 import { createRouter, createWebHashHistory, RouterOptions, Ro…

【139.单词拆分】

目录 一、题目解析二、算法原理三、代码实现 一、题目解析 二、算法原理 三、代码实现 class Solution { public:bool wordBreak(string s, vector<string>& wordDict) {int n s.size();unordered_set<string> hash;for (auto x : wordDict) hash.insert(x);…

动态sql行转列

动态sql行转列 介绍案例转之前转之后 注意 介绍 本篇介绍 根据 时间格式化后行转列的案例讲解动态sql案例的初学 案例 --设置一个动态变量 赋予初始值 SET sql NULL;--获取规范化后需要用到的行头列表 SELECT GROUP_CONCAT(CONCAT(--注意1MAX(IF(date ", date, "…

Eclipse使用配置tomcat服务:Server配置

目标&#xff1a; 在Eclipse中&#xff0c;默认会把Web项目放到Eclipse的工作空间下 的.metadata\.plugins\org.eclipse.wst.server.core\tmp0(或者是tmp1)\wtpwebapps\下 &#xff0c;如果现在Eclipse中有名为imsmanagere的项目&#xff0c;将它按以前的方式部署到服务器上&am…

揭示CDN加速的局限性与探讨其小众化原因

在网络加速领域&#xff0c;CDN&#xff08;内容分发网络&#xff09;被认为是提升性能的关键技术之一。然而&#xff0c;尽管其在某些方面表现出色&#xff0c;CDN在广泛应用中仍然相对小众。本文将从CDN加速的局限性出发&#xff0c;深入探讨为何这项技术尚未迎来大规模的应用…

【网络安全】伪装IP网络攻击的识别方法

随着互联网的普及和数字化进程的加速&#xff0c;网络攻击事件屡见不鲜。其中&#xff0c;伪装IP的网络攻击是一种较为常见的攻击方式。为了保护网络安全&#xff0c;我们需要了解如何识别和防范这种攻击。 一、伪装IP网络攻击的概念 伪装IP网络攻击是指攻击者通过篡改、伪造I…

天猫精灵/小爱同学+巴法云+Openwrt控制局电脑/群晖开关机

天猫精灵/小爱同学巴法云Openwrt控制局电脑/群晖开关机 事情的起因实战环境开始发车1.天猫精灵/小爱同学 连接 八法云 2.openwrt3.docker环节注意:sshpass 要先使用 ssh命令登陆一下你要唤醒或者远程关机的设备,不然可能因为一个登陆提示你是否登陆的yes/no导致程序没有反应,然…

DeepMind发布新模型Mirasol3B:更高效处理音频、视频数据

Google DeepMind日前悄然宣布了其人工智能研究的重大进展&#xff0c;推出了一款名为“Mirasol3B”的新型自回归模型&#xff0c;旨在提升对长视频输入的理解能力。该新模型展示了一种颠覆性的多模态学习方法&#xff0c;以更综合和高效的方式处理音频、视频和文本数据。 Googl…

Mysql数据备份 —xtrabackup

一 备份介绍 ### 优点&#xff1a; 1. **在线备份&#xff1a;** XtraBackup 支持在线备份&#xff0c;这意味着你可以在 MySQL 服务器运行的同时进行备份&#xff0c;而无需停止数据库服务。这对于生产环境中的数据库是非常关键的&#xff0c;因为可以最小化停机时间。 2. **…

算法:记忆化搜索

文章目录 记忆化搜索斐波那契数列 例题不同路径最长递增子序列猜数字大小矩阵中的最长递增路径 记忆化搜索的原理其实很简单&#xff0c;简单来说就是对暴力搜索的一些优化&#xff0c;因此整体上来讲难度不高 记忆化搜索 所谓记忆化搜索&#xff0c;直白来说就是一个带有备忘…