computed和watch

2023-05-16

computed

1、什么是computed?

computed是计算属性。类似于方法,但和methods不同,methods每次调用时会重新执行函数,而computed在其内部变量不变或其返回值不变的情况下多次调用只会执行一次,后续执行时直接从缓存中获取该computed的结果。(demo->src->views->learn->computed)

2、computed的原理是什么?

当依赖项不变化时不会进行重新的执行,只有变化时才会再次执行,计算属性的结果会被缓存,除非依赖的响应式 property 变化才会重新计算。注意,如果某个依赖 (比如非响应式 property) 在该实例范畴之外,则计算属性是不会被更新的。

3、为什么有computed?

<div>{{message.split('').reverse().join('')}}</div>

像这样在模版里直接放一些运算逻辑会很繁琐,不利于阅读,也比较难以维护(多个地方使用到时)。这种情况就可以想到使用运算属性,以上可写成:

<div>{{reverseMessage}}</div>
data(){
	return {
		message: 'hello'
	}
}
computed: {
	reverseMessage(){
		return this.message.split('').reverse().join('')
	}
}

这样模版里代码就简洁很多,并多地方使用也可以做到同意管理

5、computed的应用场景?

使用场景:当一个值受多个属性影响的时候

watch

1、什么是watch?

Vue 通过 watch 选项提供了一个更通用的方法,来响应数据的变化。当需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。
一个对象,键是需要观察的表达式,值是对应回调函数。值也可以是方法名,或者包含选项的对象。

2、watch的原理 (需要看源码,慢慢理解,有点困难,后期补充)

3、用法:

基础用法用于监听数据的变化,并及时更新dom

<input type="text" v-model="cityName"/>
  data(): {
  	return {
   		cityName: 'shanghai'
	}

  },
  watch: {
    cityName(newName, oldName) {      // ...    }
  } 

或者直接在watch里面写一个监听处理函数,当每次监听到 cityName 值发生改变时,执行函数。也可以在所监听的数据后面直接加字符串形式的方法名:

watch: {
    cityName: 'nameChange'
    }
 }
methods: {
	nameChange () {
		console.log('被调用了')
	}
}

这样使用watch时有一个特点,就是当值第一次绑定的时候,不会执行监听函数,只有值发生改变才会执行。如果我们需要在最初绑定值的时候也执行函数,则就需要用到immediate属性。比如:当父组件向子组件动态传值时,子组件props首次获取到父组件传来的默认值时,也需要执行函数,此时就需要将immediate设为true

  • immediate立即执行
watch: {    
// 关键字    
  cityName: {      
	handler() {       
	    this.nameChange()      
	},
    immediate: true    
  }  
}

监听的数据后面写成对象形式,包含handler方法和immediate,immediate表示在watch中首次绑定的时候,是否执行handler,值为true则表示在watch中声明的时候,就立即执行handler方法,值为false,则和一般使用watch一样,在数据发生变化的时候才执行handler。

  • deep深度监听
    当需要监听一个对象的改变时,普通的watch方法无法监听到对象内部属性的改变,只有data中的数据才能够监听到变化,此时就需要deep属性对对象进行深度监听。
<input type="text" v-model="cityName.name"/>  <!-- 监听cityName的name对象 -->

设置deep: true 则可以监听到cityName.name的变化。


  data(): {
  	return: {
	    cityName: {id: 1, name: 'shanghai'}
	}
  },
  watch: {
    cityName: {
      handler(newName, oldName) {      // ...    },
    deep: true,
    immediate: true
    }
  } 

但是,此时会给cityName的所有属性都加上这个监听器,当对象属性较多时,每个属性值的变化都会执行handler。如果只需要监听对象中的一个属性值,则可以做以下优化:使用字符串的形式监听对象属性:

watch: {
'cityName.name': {
      handler(newName, oldName) { 
     // ...    
  },
      deep: true,
      immediate: true
    }
  }

数组(一维、多维)的变化不需要通过深度监听,对象数组中对象的属性变化则需要deep深度监听。

区别

computed 是计算一个新的属性,并将该属性挂载到 vm(Vue 实例)上,而 watch 是监听已经存在且已挂载到 vm 上的数据,所以用 watch 同样可以监听 computed 计算属性的变化(其它还有 data、props)
computed 本质是一个惰性求值的观察者,具有缓存性,只有当依赖变化后,第一次访问 computed 属性,才会计算新的值,而 watch 则是当数据发生变化便会调用执行函数。

computed:通过属性计算而得来的属性

1、computed内部的函数在调用时不加()。

2、computed是依赖vm中data的属性变化而变化的,也就是说,当data中的属性发生改变的时候,当前函数才会执行,data中的属性没有改变的时候,当前函数不会执行。

3、computed中的函数必须用return返回。

4、在computed中不要对data中的属性进行赋值操作。如果对data中的属性进行赋值操作了,就是data中的属性发生改变,从而触发computed中的函数,形成死循环了。

5、当computed中的函数所依赖的属性没有发生改变,那么调用当前函数的时候会从缓存中读取。
   使用场景:当一个值受多个属性影响的时候------------购物车商品结算
  
  watch:属性监听

1、watch中的函数名称必须要和data中的属性名一致,因为watch是依赖data中的属性,当data中的属性发生改变的时候,watch中的函数就会执行。

2、watch中的函数有两个参数,前者是newVal,后者是oldVal。

3、watch中的函数是不需要调用的。

4、watch只会监听数据的值是否发生改变,而不会去监听数据的地址是否发生改变。也就是说,watch想要监听引用类型数据的变化,需要进行深度监听。“obj.name”(){}------如果obj的属性太多,这种方法的效率很低,obj:{handler(newVal){},deep:true}------用handler+deep的方式进行深度监听。
  
  5、immediate:true 页面首次加载的时候做一次监听。
  
  适用场景:当一条数据的更改影响到多条数据的时候---------搜索框

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

computed和watch 的相关文章

  • vue watch深度监控一个对象下新增属性不生效问题

    先简单还原下项目中遇到的问题 xff1a adc为一个空对象 xff0c watch深度监听abc下的pageNum属性 xff08 此时还没有 xff09 data return abc watch 39 abc 39 deep true
  • VUE3中watch和watchEffect的用法

    watch和watchEffect都是监听器 xff0c 但在写法和使用上有所区别 watch在监听 ref 类型时和监听reactive类型时watch函数的写发有所不一样 watch在监听 ref 类型时 xff1a lt script
  • watch与computed的区别

    今天说说watch与computed的区别 我们知道有些功能既可以用watch实现又可以用computed实现 xff0c 谁比谁好呢 xff0c 没个准信 我们先来用它俩实现同一功能再进行对比看看具体好处 例子 xff1a 定义两个输入框
  • vue中 computed和watch的一些简单理解(区别)

    今天看到一个问题 xff0c 就是 vue 的 computed 和 watch 要在哪些场景下使用 xff0c 其实也就是在问他们的区别 computed 也就是计算属性 xff0c 它可以帮助我们将在模板中的一些稍微复杂的逻辑计算放回到
  • Vue中的watch 和computed 属性

    之前写过一篇关于computed计算属性的文章 xff0c 详见这里 computed 内的function只执行一次 xff0c 仅当function内涉及到Vue实例绑定的data的值的改变 xff0c function才会从新执行 x
  • setup中使用watch

    watch属性监听器的作用在vue3 0中没有改变 xff0c 还是监听值得变化 在vue3 0中 xff0c 仍然支持watch配置项 但是我们要在setup中使用watch得话 xff0c 我们要导入watch的API xff0c 然后
  • Kids are forbidden to watch TV after school (by quqi99)

    作者 xff1a 张华 发表于 xff1a 2022 03 30 版权声明 xff1a 可以任意转载 xff0c 转载时请务必以超链接形式标明文章原始出处和作者信息及本版权声明 http blog csdn net quqi99 iptab
  • 详解vue.js中watch的使用

    在vue中 xff0c 使用watch来响应数据的变化 watch的用法大致有三种 下面代码是watch的一种简单的用法 xff1a lt input type 61 34 text 34 v model 61 34 cityName 34
  • 在 XCode 6 中如何设置观察点而不停止执行?

    您可以按照以下步骤轻松在 XCode 中设置观察点 顺便说一句 如果有更简单的方法 我想知道 运行你的程序 在使用变量的代码中设置断点 到达断点时 右键单击变量并选择 Watch nameOfTheVariable 继续执行 唯一的问题是每
  • Grunt - 监视文件并在文件更改时进行 SFTP

    我正在尝试自动上传 css文件 当它从 Sass 编译时 这就是我的Gruntfile js module exports function grunt Project configuration grunt initConfig pkg
  • 在“本地”或“监视”窗口中查看对象会导致 Excel 崩溃

    在 Excel 中 当我运行一些代码并放置断点时 我可以查看局部窗口中的值 在本地窗口中 当我尝试为我创建的类展开对象时 Excel 崩溃并显示 Microsoft Office Excel 遇到问题 需要关闭 对于给您带来的不便 我们深表
  • watch 命令不适用于使用管道的命令[关闭]

    Closed 这个问题是无法重现或由拼写错误引起 目前不接受答案 非常简单 快速的问题 为什么这个命令不起作用 watch ls log wc l or watch d ls log wc l 我正在尝试watch当前目录中文件总数的更新
  • 使用 PHPstorm 7 文件观察器将 SCSS / SASS 转换为特殊文件夹中的 CSS

    我使用 PHPstorm 6 并且我的 SCSS 文件被编译到 CSS 文件夹中 所以我有 css main css img js scss main scss variables scss Hier are my definitions
  • 观看过程替换

    我经常运行命令 squeue u USER tee gt wc l where squeue is a 泥浆命令 https slurm schedmd com squeue html查看您正在运行多少个作业 这给了我两个输出squeue并
  • vuejs2:我如何销毁观察者?

    我怎样才能摧毁这个观察者 当我的异步数据从父组件加载时 我的子组件中只需要一次 export default watch data function this sortBy 格雷戈尔 如果通过调用 vm watch 函数动态构造观察程序 它
  • 错误:EMFILE:打开的文件太多,请注意,除非我使用 sudo

    描述 最近我遇到了一个问题 我无法奔跑yarn start in element web目录 我得到这些errors https pastebin ubuntu com p 93v6Yx58DT 原本我以为这与element web本身所以
  • 有没有比“手表制造”更明智的替代方案?

    我遇到了这个有用的提示 如果您经常处理文件并且希望它们自动构建 则可以运行 手表品牌 每隔几秒钟它就会重新运行一次 一切都会构建完成 然而 它似乎一直在吞噬所有的输出 我认为它可能更聪明 也许显示输出流 但抑制 全部 不做任何事情 这样如果
  • 调试时的监视窗口:CS0103:当前上下文中不存在名称“

    我正在使用 Visual Studio Community 2022 64 bit Version 17 4 2 with NET Framework Version 4 8 09032 昨天 2022 年 2 月 12 日有更新 我是通过
  • 文件更改时重新启动 Heroku 本地吗?

    看来以 heroku local web 启动的本地服务器不会监视文件更改并自行重新启动 我怎样才能让它做到这一点 最简单的方法是运行 nodemonheroku local作为可执行文件 即nodemon exec heroku loca
  • CIFIlter 是否有替代方案可以在 watch os 6 中生成二维码

    我正在开发一个独立于手表的应用程序 我想在 watchkit 上生成二维码 但是由于 coreImage 不能与 watchkit 一起使用 我们还有其他方法可以做到这一点吗 Thanks 我使用支持 watchos 的库 例如EFQRCo

随机推荐

  • Sql 数据库细节全解(icelei讲sql)

    磊哥哥讲Sql 一 what who defined1 数据库whatever2 引言导入 二 database and tables guy1 Basic element project definition2 template data
  • 编写一个Shell函数检查Linux系统中某文件的权限是否小于一个值

    我编写了一个Shell函数 xff0c 使用这个函数需要传两个参数 xff1a 文件绝对路径和一个三位整数 通过这个函数可以检查文件权限是否小于等于你给定的值 submod export filepath 61 1 export maxmo
  • codeforces 1328 B. K-th Beautiful String

    题意 xff1a 就是找到第 k k k 个全排列的字符串 通过找规律 xff0c 第一个 b b b 在倒数第二位有
  • 使用python 解ccf-csp 2019-03-1小中大

    传送 问题描述 问题分析 这个题目最大值和最小值很好得到 xff0c 因为已经排好序了 xff0c 只需要判断一下是正序还是反序就可以了 xff0c 至于中位数我们得先清除它的概念 xff0c 如果不清楚 xff0c 也可以从给出来的例子判
  • ubuntu生成anaconda快捷方式

    https blog csdn net weixin 45653050 article details 105636020
  • 编码转换

    编码定义 在计算机硬件中 xff0c 编码 xff08 coding xff09 是在一个主题或单元上为数据存储 xff0c 管理和分析的目的而转换信息为编码值 xff08 典型地如数字 xff09 的过程 在软件中 xff0c 编码意味着
  • Visual Studio Code安装go插件报错

    VScode第一次跑go代码时提示The go outline command is not available Run 34 go get v github com ramya r有效解决安装方法 出现问题 xff1a Visual St
  • TCP实现服务器与客户端的连接(多线程)

    上一篇博客中 xff0c 我们用TCP实现了服务器与客户端的连接 但是有一个问题 xff0c 即一个客户端在和服务器交互时 xff0c 其他客户端无法连接 xff0c 为解决这一问题 xff0c 我们将服务器端改造为线程池的版本 xff08
  • 【GIT】在kali linux上安装git与码云提交|kali安装wps

    xff11 安装git kali自带 xff0c xff08 apt get install git xff09 2 添加git服务用户 xff08 这一步不知道有没有用也输入了 xff0c 只是有点问题 xff09 useradd git
  • Windows10系统重装之U盘安装

    1 准备工作 操作系统 xff1a Windows 10 安装工具 xff1a U盘安装 程序下载 xff1a MediaCreationTool 链接 xff1a https pan baidu com s 1GTnFze86sDjRnV
  • ubuntu18.04安装cuda和cudnn

    一 安装 cuda 1 首先查看自身电脑最高支持的cuda版本为多少 xff0c 在终端输入以下指令 nvidia smi 可以看到我的最高支持 cuda 11 4 2 打开英伟达官网 下载官方cuda 此处我下载的是cuda 11 0 3
  • 批处理打开指定路径下的所有文件

    需求 xff1a 批处理打开指定路径下的所有文件 前提 xff1a 默认各位同学已经熟悉常用的各种批处理命令 xff0c 本文仅对涉及到的批处理命令做简单的介绍 xff0c 有需要进一步学习 xff0c 可查阅网上其它资料 也可通过CMD命
  • 系统调用的概念及原理

    系统调用与内核函数 内核函数与普通函数形式上没有什么区别 xff0c 只不过前者在内核实现 xff0c 因此要满足一些内核编程的要求 系统调用是用户进程进入内核的接口层 xff0c 它本身并非内核函数 xff0c 但它是由内核函数实现的 x
  • CMAKE编译ORB-SLAM2时,报错找不到Eigen3,报错Eigen3 found!之类错误(已解决)

    当编译执行到 build sh文件时 xff0c 报错Eigen3 found xff01 之类错误 解决方法 xff1a 在主文件夹下直接查找FindEigen3 cmake文件 然后把它复制到报错的CMakeLists txt对应的路径
  • Python爬虫---王者荣耀(最详细)

    Python爬虫 王者荣耀 最详细 首先来到王者荣耀的首页 点击游戏壁纸进去 xff0c 就会看到这些图片 xff0c 大致看了一下 xff0c 是我们想要的东西 点开图片看看能不能找到什么规律 可以看见每张图下面都有六个分辨率的选项 xf
  • hypermesh分析流程

    对于CAE初学者来说 xff0c hypermesh是一个很适合的工具 xff0c 既可以作为其他分析软件的输入 xff0c 自带的求解器也能取得很精确的结果 xff0c 本文是作者的一些实用心得 xff0c 全是干货 学习一个软件时 xf
  • PVE7.1安装Jellyfin几个问题

    按网络资料显示 xff0c 最好是在LXC安装 一 模板问题 直接创建CT xff0c 模板里是空的 xff0c 所以需要在pve local xff08 pve xff09 模板里 xff0c 找到相关模板 xff08 如ubuntu20
  • Mybatis-Plus代码生成器(generator)

    在写代码的时候 xff0c 使用mybatis plus的代码生成器可以帮助我们减少很多工作量 xff0c 详细说明可以看官方文档https baomidou com pages 779a6e 在使用之前需要把包给导一下 xff0c gen
  • TT 的神秘礼物

    题目 TT 的神秘礼物 题意 xff1a TT 是一位重度爱猫人士 xff0c 每日沉溺于 B 站上的猫咪频道 有一天 xff0c TT 的好友 ZJM 决定交给 TT 一个难题 xff0c 如果 TT 能够解决这个难题 xff0c ZJM
  • computed和watch

    computed 1 什么是computed xff1f computed是计算属性 类似于方法 xff0c 但和methods不同 xff0c methods每次调用时会重新执行函数 xff0c 而computed在其内部变量不变或其返回