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

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.mfbz.cn/a/157510.html

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

相关文章

cookie机制 + java 案例

目录 为什么会有cookie?? cookie从哪里来的&#xff1f;&#xff1f; cookie到哪里去&#xff1f;&#xff1f; cookie有啥用&#xff1f;&#xff1f; session HttpServletRequest类中的相关方法 简单的实现cookie登录功能 实现登录页面 实现servlet逻辑 实现生成主…

牛客机考题编程题输入输出

有时空可以练练这里的题目&#xff1a; https://ac.nowcoder.com/acm/contest/5652 做个总结&#xff0c;其实就两种输入类型&#xff1a; 一种是下面这种&#xff0c;需要对输入的每行进行运算 这种就是循环读取每行的数做一个运算&#xff1a; import sys while True:line …

【Nuxt】Nuxt3 动态导入图片 src

nuxt3 不再支持 require 动态导入资源&#xff0c;因此需要我们将图片放到 public 目录下&#xff0c;这样我们就可以动态导入了 比如下面 &#x1f447;&#xff1a; 感谢 Nuxt3遇见的坑&#xff08;四&#xff09;&#xff1a;图片动态渲染之后打包路径问题以及打包css样式…

代码混淆的原理是什么?常见代码混淆方法介绍

​ 代码混淆的原理是什么&#xff1f;常见代码混淆方法介绍 本文主要想你介绍代码混淆的原理&#xff0c;常见代码混淆方法&#xff0c;欢迎查阅~ 移动应用代码安全非常重要&#xff0c;代码逆向会导致代码逻辑被获取&#xff0c;进一步导致控制流被hook&#xff0c;安全防线被…

SystemVerilog学习 (11)——覆盖率

目录 一、概述 二、覆盖率的种类 1、概述 2、分类 三、代码覆盖率 四、功能覆盖率 五、从功能描述到覆盖率 一、概述 “验证如果没有量化&#xff0c;那么就意味着没有尽头。” 伴随着复杂SoC系统的验证难度系数成倍增加&#xff0c;无论是定向测试还是随机测试&#xff…

reids面试题

1 redis是单线程吗&#xff1f; Redis是单线程 主要是指Redis的网络10和键值对读写是由一个线程来完成的&#xff0c;Redis在处理客户端的请求时包括获取(socket 读)、解析、执行、内容返回(socket 写) 等都由一个顺序串行的主线程处理&#xff0c; 但Redis的其他功能&#xff…

结合 Django 和 Vue.js 打造现代 Web 应用

概要 在 Web 开发的世界里&#xff0c;Django 和 Vue.js 分别是后端和前端两个非常流行的框架。Django 以其强大的后端能力、快速开发以及安全性而著称&#xff0c;而 Vue.js 因其简洁、灵活和易于上手在前端开发领域广受欢迎。 本篇文章将详细介绍如何将 Django 与 Vue.js 结…

Jetson简介、编程开发与环境搭建

Jetson简介、编程开发与环境搭建 简介常用指令Jetpack环境搭建 简介 Jetson是由NVIDIA推出的一系列嵌入式系统&#xff0c;旨在用于机器学习和人工智能应用的开发。Jetson平台通常使用NVIDIA的GPU加速技术&#xff0c;以提供高性能的计算能力。NVIDIA推出了多个Jetson系列的产…

成集云 | 企业微信集成用友T+ | 解决方案

源系统成集云目标系统 方案介绍 用友T是一款由用友畅捷通推出的新型互联网企业管理系统&#xff0c;它主要满足成长型小微企业对其灵活业务流程的管控需求&#xff0c;并重点解决往来业务管理、订单跟踪、资金、库存等管理难题。 企业微信是一款通讯与办公工具&#xff0c;具…

NJU操作系统公开课笔记(1)

目录 一.计算机系统概述 二.计算机硬件系统 三.计算机软件系统 四.计算机操作技术的发展 五.计算机OS 1.资源管理的角度 2. 程序控制的角度 3.OS控制计算机的角度 4.人机交互的角度 5.程序接口的角度 6.系统结构的角度 单道批处理系统 多道批处理系统 分时系统 …

【Git学习二】时光回溯:git reset和git checkout命令详解

&#x1f601; 作者简介&#xff1a;一名大四的学生&#xff0c;致力学习前端开发技术 ⭐️个人主页&#xff1a;夜宵饽饽的主页 ❔ 系列专栏&#xff1a;JavaScript小贴士Git等软件工具技术的使用 &#x1f450;学习格言&#xff1a;成功不是终点&#xff0c;失败也并非末日&a…

链路追踪,助您洞悉数据联动分析的奥秘

前言 在当今复杂的分布式系统中&#xff0c;了解请求在不同服务之间的传递路径和性能情况对于系统的性能优化至关重要。链路追踪通过记录和分析请求在系统中的传递路径和性能数据&#xff0c;为实现数据联动分析提供了重要的支持。我们曾谈论观测云提供火焰图能够实现链路追踪…

开发知识点-前端-webpack

webpack技术笔记 一、 介绍二、 下载使用 一、 介绍 Webpack是一个现代 JavaScript 应用程序的静态模块打包器 打包&#xff1a;可以把js、css等资源按模块的方式进行处理然后再统一打包输出 静态&#xff1a;最终产出的静态资源都可以直接部署到静态资源服务器上进行使用 模…

mysql之rsync远程同步

&#xff08;一&#xff09;rsync 1、rsync&#xff1a;是一个开源的快速备份工具&#xff0c;可以在不同主机之间同步整个目录 2、在远程同步中&#xff0c;一个是源端&#xff0c;一个是发起端 &#xff08;1&#xff09;源端负责文件的原始位置&#xff0c;发起端和源端的…

最新随机小姐姐无水印开源版HTML源码

推荐一款高质量的HTML引流源码&#xff0c;适合浏览小姐姐短视频 这款源码具有出色的用户界面设计&#xff0c;给人视觉上的美感 视频播放流畅稳定&#xff0c;给用户带来良好的观影体验 小姐姐们的外貌也非常美丽吸引人 想要浏览精彩的小姐姐短视频&#xff0c;不妨试试这款…

Equifax案例分析与合规性场景实践

在当今数字化时代&#xff0c;数据安全已经成为各个组织和企业亟待解决的问题。尤其是在数据泄露事件不断增多的背景下&#xff0c;保护敏感数据免受非法访问和泄露变得尤为紧迫。为了应对这一挑战&#xff0c;许多组织和企业开始利用密钥管理服务(KMS)来加强其数据安全性&…

易点易动RFID管理系统:年终固定资产盘点的革命

随着现代企业规模的扩大和固定资产数量的增加&#xff0c;年终固定资产盘点成为了一项繁琐而耗时的任务。传统的手工盘点方法不仅效率低下&#xff0c;还容易出现错误和遗漏。为了解决这一难题&#xff0c;易点易动RFID管理系统应运而生。本文将重点介绍易点易动RFID管理系统在…

基于SSM的个人通讯录(有报告)。Javaee项目。

演示视频&#xff1a; 基于SSM的个人通讯录&#xff08;有报告&#xff09;。Javaee项目。 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 项目介绍&#xff1a; 采用M&#xff08;mod…

分享一个字体抽取软件

一、先下载软件。 地址 蓝奏云 密码 bjnr Fontmin-v0.2.0-win64 下载下来直接就是exe文件&#xff0c;直接双击安装即可。 二、打开默认如图显示 三、接下来把你的字体文件拖拽到里面 四、在把你用到这个字体的文字填入到框内 五、最后点击生成。 生成的字体文件只有2k了…

Eclipse切换中文环境

PACK包链接 地址&#xff0c;进入后可以看到不同版本的包。 要选择跟自己Eclipse版本一致的包&#xff0c;比如我的Eclipse启动界面如下&#xff0c;我就要找Helios的包&#xff08; Juno、Indigo、Helios、Kepler这些具体怎么划分的我也不清楚&#xff09;。 在线安装 打…
最新文章