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.hqwc.cn/news/188432.html

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

相关文章

2023年【陕西省安全员B证】考试题库及陕西省安全员B证找解析

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 陕西省安全员B证考试题库是安全生产模拟考试一点通生成的&#xff0c;陕西省安全员B证证模拟考试题库是根据陕西省安全员B证最新版教材汇编出陕西省安全员B证仿真模拟考试。2023年【陕西省安全员B证】考试题库及陕西省…

修改YOLOv5的模型结构第二弹

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 上节说到了通过修改YOLOv5的common.py来修改模型的结构&#xff0c;修改的是模块的内…

ArcGIS创建格网

目录 1、创建网格 2、裁剪边界外的网格 3、只保留边界内完整的网格 1、创建网格 首先&#xff0c;我们在创建渔网前&#xff0c;需要指定渔网覆盖的范围。这里我们就以四子王为例 在ArcMap软件中&#xff0c;我们依次选择“Toolboxes”→“Data Management Tools&#xff0…

vscode中vue项目引入的组件的颜色没区分解决办法

vscode中vue项目引入的组件的颜色没区分解决办法 图中引入组件和其他标签颜色一样没有区分&#xff0c;让开发者不易区分&#xff0c;很蓝瘦 这个就很直观&#xff0c;解决办法就是你当前的vscode版本不对&#xff0c;你得去找找其他版本&#xff0c;我的解决办法就是去官网历…

交易者最看重什么?anzo Capital这点最重要!

交易者最看重什么&#xff1f;有人会说技术&#xff0c;有人会说交易策略&#xff0c;有人会说盈利&#xff0c;但anzo Capital认为Vishal 最看重的应该是眼睛吧&#xff01; 29岁的Vishal Agraval在9年前因某种原因失去了视力&#xff0c;然而&#xff0c;他的失明并未能阻…

国内外优秀的六款项目管理软件推荐

在面对各种项目管理需求时&#xff0c;选择适合的软件非常重要&#xff0c;项目管理软件不但帮助项目经理更准确的把控项目进度&#xff0c;也使分布在各地的团队能够更高效地合作。 下面是国内外优秀的六款项目管理软件&#xff1a; 1、进度猫 进度猫作为国产项目进度管理…

Java-Review

题型分值总分分布简答 5 ∗ 8 ′ 5*8 5∗8′ 4 0 ′ 40 40′面向对象、异常处理、多线程、输入输出处理程序分析和补全 3 ∗ 1 0 ′ 3*10 3∗10′ 3 0 ′ 30 30′异常处理、Collection、图形化界面、输入输出处理编程 2 ∗ 1 5 ′ 2*15 2∗15′ 3 0 ′ 30 30′Collections、多线…

黑马React18: 基础Part 1

黑马React: 基础1 Date: November 15, 2023 Sum: React介绍、JSX、事件绑定、组件、useState、B站评论 React介绍 概念: React由Meta公司研发&#xff0c;是一个用于 构建Web和原生交互界面的库 优势: 1-组件化的开发方式 2-优秀的性能 3-丰富的生态 4-跨平台开发 开发环境搭…

成功解决:文档根元素 “mapper“ 必须匹配 DOCTYPE 根 “null“

文章底部有个人公众号&#xff1a;热爱技术的小郑。主要分享开发知识、学习资料、毕业设计指导等。有兴趣的可以关注一下。为何分享&#xff1f; 踩过的坑没必要让别人在再踩&#xff0c;自己复盘也能加深记忆。利己利人、所谓双赢。 文章目录 前言错误信息解决方法 前言 错误…

如何快速下载mysql的不同版本并启动mysql服务?

如何快速下载mysql的不同版本并启动mysql服务&#xff1f; 下载mysql的安装版本 首先我们要使用到迅雷去下载&#xff0c;因为迅雷下载是很快的。在迅雷里面搜索下面的Mysql Installer安装窗口&#xff0c;如下图&#xff1a; 连接&#xff1a;https://dev.mysql.com/downlo…

叮!您收到了一封来自达坦科技的Hackthon邀请函

DatenLord Hackathon 2023正式启动&#xff01;达坦科技基于其跨云分布式文件系统DatenLord项目&#xff0c;结合AI大模型时代背景&#xff0c;搭建了擂台&#xff0c;在此正式向您发出邀约&#xff01; 本次大赛赛题深刻有趣&#xff0c;奖品丰厚多样&#xff0c;借此机会您不…

关于python中内存分配的问题,运行一些操作可能会导致为新结果分配内存,用Python的id()函数演示

一、考虑背景&#xff1a; 一般在python中不会考虑像C中的内存问题&#xff0c;但是在一些高级应用中会考虑&#xff0c;例如有一个特别特别大的矩阵&#xff0c;最好不要不断的赋值&#xff0c;导致内存问题产生。 二、python中的id&#xff1a; 在python中有个id&#xff…