首页 > 其他分享 >[Vue] computed、watch 和 watchEffect 的区别

[Vue] computed、watch 和 watchEffect 的区别

时间:2024-09-14 17:40:23浏览次数:8  
标签:Vue computed 响应 watch watchEffect 依赖 监听

前言

当依赖的数据发生改变,computedwatch watchEffect 都会被触发。但是它们之间又有自己的特点,使用场景也不一样。

关于 computed 是什么,以及它和普通函数的区别、运用场景,查看我的另一篇博文:[Vue] computed 和 普通函数的区别

特性 watch watchEffect computed
用途 监听特定响应式数据的变化,并在变化时执行回调 自动追踪所有响应式数据并执行副作用 定义基于响应式数据的计算属性
依赖声明 显式声明要监听的数据或计算属性 自动追踪回调中读取的所有响应式数据 显式声明依赖的响应式数据
返回值 无,主要用于执行副作用 无,主要用于执行副作用 返回计算得到的值
缓存 不缓存结果,每次依赖变化时都会触发 不缓存结果,每次依赖变化时都会触发 缓存计算结果,只有依赖变化时重新计算
初始执行 不会立即执行,只有当依赖变化时才执行 初始时立即执行一次,然后每次依赖变化时重新执行 在被读取时惰性求值
旧值与新值 可以访问旧值和新值 不提供旧值和新值 不提供旧值和新值
深度监听 可以通过 { deep: true } 选项进行深度监听 不支持深度监听 不支持深度监听
适用场景 需要精确控制响应式数据的监听和副作用 需要自动追踪多个依赖的副作用 计算属性需要在模板中展示,或计算结果需缓存

watch

用途watch 是显式的监听器,主要用于监听特定的响应式数据变化。你可以选择要监听哪些变量(或计算属性),并在它们发生变化时执行特定的逻辑。

场景:适合需要在某些数据变化时执行异步操作或复杂逻辑的场景,比如发起 API 请求、手动计算等。

const stop = watch(count, (newValue, oldValue) => {
  console.log(`count 从 ${oldValue} 变为 ${newValue}`);
});

// 停止监听
stop();

watchEffect

用途:watchEffect 是更自动化的反应式追踪器,能够自动追踪在回调函数中使用的所有响应式数据,并在这些数据发生变化时重新执行回调函数。

场景:适合依赖于多个响应式数据的场景,尤其是在你不想手动指定要监听的依赖时。常用于简化对多个响应式状态的追踪。

const stop = watchEffect(async (onCleanup) => {
  const { response, cancel } = doAsyncWork(id.value)
  // `cancel` 会在 `id` 更改时调用
  // 以便取消之前
  // 未完成的请求
  onCleanup(cancel)
  data.value = await response
});

// 停止监听
stop();

标签:Vue,computed,响应,watch,watchEffect,依赖,监听
From: https://www.cnblogs.com/Himmelbleu/p/18414395

相关文章

  • [Vue] v-once、v-memo 和 key 优化组件性能
    前言key、v-once和v-memo都是Vue提供的用于优化性能的工具,主要目的是减少不必要的渲染和更新操作,从而提升应用的性能。key相关的就不用多说了,[Vue]v-forkey用index会出现什么问题。v-once这个很简单,仅渲染元素和组件一次,并跳过之后的更新。在随后的重新渲染,元素/组......
  • Vue3 结合 Cesium 动态绘制矩形
    相关概念Viewer:newCesium.Viewer (container, options )介绍:用于构建应用程序的基本小部件。它将所有标准Cesium小部件组合到一个可重用的程序包中。Entity:newCesium.Entity ( options )介绍:实体实例将多种形式的可视化聚集到单个高级对象中。可以手动创建它们......
  • SpringBoot+Vue3项目邮箱验证码注册详细教程
    引言该篇文章是以SpringBoot+Vue3技术栈搭建的项目的邮箱注册登录流程,注册用户使用邮箱校验,使用qq邮箱发送验证码,并且把验证码存入Redis以备校验使用的详细介绍干货部分1.在SpringBoot项目的application.yaml文件中配置qq邮箱spring:#mail邮箱mail:#SMTP......
  • vue实现点击任意位置关闭侧滑显示
    需求:点击el-table列表展示侧滑框,再次点击列表中不同数据,刷新侧滑框中数据;点击外部任意位置关闭侧滑框思路:给整个页面加点击事件click,通过target判断点击的外层元素以及点击的位置,执行关闭侧滑框方法代码:mounted中监听click事件mounted(){letdoc=$("#app").get(0);......
  • vue2制作高复用页面
        记录一下页面搭建记录,利用vue2组件化开发的思想。这个页面适合于大部分信息管理系统~。模板固定,每次使用,直接修改表单表格参数,api接口等。     以上图页面为例,一个基础数据信息页面可以分为,分类(左侧),数据信息(右侧),搜索表单(右上),数据表格(右下),新增或编辑表......
  • vue2 antv x6 入门 (一)画布、节点、边
    安装#npmnpminstall@antv/x6--save#yarnyarnadd@antv/x6 1.初始化画布<divid="container"></div>import{Graph}from'@antv/x6'constgraph=newGraph({container:document.getElementById('container'......
  • Vue3中组件通信的几种方式
    Vue3组件通信和Vue2的区别:移出事件总线,使用mitt代替。vuex换成了pinia。把.sync优化到了v-model里面了。把$listeners所有的东西,合并到$attrs中了。$children被砍掉了。【1】props概述:props是使用频率最高的一种通信方式,常用与:父↔子。若父传子:属性值是非函数。若子传父:属性......
  • Vue3中Pinia存储和修改数据应用实践
    安装pinia:npminstallpiniamain.ts中使用pinia://引入createApp用于创建应用import{createApp}from'vue'//引入App根组件importAppfrom'./App.vue'//引入路由器importrouterfrom'./router'//创建一个应用constapp=createApp(App)//使用路由器app.use......
  • Vue3中路由传参的几种方式实践
    【1】RouterLink+query父组件脚本如下:<scriptsetuplang="ts"name="News">import{reactive}from'vue'import{RouterView,RouterLink}from'vue-router'constnewsList=reactive([{id:'asfdtrfay01',......
  • Vue2/Vue3中编程式路由导航实践总结
    【1】Vue2编程式路由导航①router.push除了使用<router-link>创建a标签来定义导航链接,我们还可以借助router的实例方法,通过编写代码来实现。router.push(location,onComplete?,onAbort?)注意:在Vue实例内部,你可以通过$router访问路由实例。因此你可以调用this.$router......