详解Vue中的computed和watch

详解Vue中的computed和watch

  • 前言
  • 原理
    • computed
      • computed特点
      • computed有几种创建方式
      • 应用
    • Watch
      • Watch有几种创建方式
      • Watch主要内容
      • Watch特性
      • 应用场景
  • computed和Watch区别

前言

在Vue当中,watchcomputed都可以实现监听的效果,本文主要是围绕watch和computed这两个属性来进行深入的讲解,讲解内容包括它们的原理、实现方式、各自优劣以及区别。

原理

computed

概念:通过对某个属性值进行一系列计算,让该属性值为一个新的值。在计算过程中,可以调用多个其他属性值用于计算。
computed又称计算属性,它主要作用就是用于在Vue当中监听某个属性的变化。举个例子来分别演示没有computed和用了computed的vue实例。
需求:让两个数字相加求解。
没有用computed:

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><!--1.导入Vue的库文件--><script src="vue.js"></script></head><body><div id="app">a:<input type="number" v-model="a"><br>b:<input type="number" v-model="b"><br><button @click="btn">计算</button><div>相加等于:{{ c }}</div></div><!--2.创建Vue的实例对象--><script>//创建Vue的实例const vm = new Vue({// el属性是固定写法。// 表示当前的VM实例要控制页面上的哪上区域,收接的是一个选择器。el: "#app",data: {a: '',b: '',c: null},methods: {btn() {this.c = parseFloat(this.a) + parseFloat(this.b)}}})</script></body>
</html>

在上述代码中,我们可以发现,求解是用了一个按钮实现,首先我们创建了Vue实例,然后创建三个变量a,b,c,c是结果,a,b是两个数字,用v-model进行数据绑定后,输入点击按钮后就能出现结果。那么如果使用计算属性computed,也可以用另一种方式实现相同的效果。计算操作在计算属性中进行实现。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><!--1.导入Vue的库文件--><script src="vue.js"></script></head><body><div id="app">a:<input type="number" v-model="a"><br>b:<input type="number" v-model="b"><br><div>结果:{{ c }}</div></div><!--2.创建Vue的实例对象--><script>//创建Vue的实例const vm = new Vue({// el属性是固定写法。// 表示当前的VM实例要控制页面上的哪上区域,收接的是一个选择器。el: "#app",data: {a: '',b: '',},computed:{c(){return parseFloat(this.a)+parseFloat(this.b);}}})</script></body>
</html>

在上述代码中,我们可以看到,计算属性代替了按钮实现了相同的计算功能。那么同时我们发现,计算属性要放在computed节点下才生效,而节点下的计算属性,语法格式和定义method方法的语法格式相同,这个计算属性,会实时监听它的属性值是否发生改变,如果发生改变就会立即缓存,不需要任何人为操作。它在初始化时就会进行缓存,那么在上述代码中,它的初始值就为NaN,NaN展开就为Not a Number,中文叫非数。输入a和b的数字后,就可以看到立刻发生变化。

computed特点

  • 计算属性都放在computed节点下。
  • 定义方式和方法相同。
  • 只要该计算属性的依赖属性发生改变,它就会重新计算并进行视图更新以及计算属性缓存。
  • 所有的计算属性都有缓存机制,当初始化后即开始了第一次计算属性缓存,而看到的值,实际是从缓存中拿到的。
  • 惰性执行:如果不调用这个计算属性,但是依赖项改变了,那属性会被标记为dirty,但是它计算,只有调用了且被标记为dirty了,它才会进行计算缓存和更新操作。
  • 不允许执行异步操作

computed有几种创建方式

两种,一种函数式,一种对象式。

function a(){} || a:{get(){},set(){}}

应用

  • 当一个属性频繁的受其他多个属性影响时可以被应用。

Watch

概念: 监听器,是Vue实例的一个属性,是用来响应数据的变化,需要在数据变化时执行异步或开销较大的操作时,这个方式是最有用的。

大白话就是,监听某个属性值是否变化,如果该属性值发生改变,则做一系列与改变有关的操作。

实例:输入姓,输入名,得到姓名

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>Document</title><!--1.导入Vue的库文件--><script src="vue.js"></script></head><body><div id="app">:<input type="text" v-model="x"><br>:<input type="text" v-model="m"><br><div>结果:{{ xm }}</div></div><!--2.创建Vue的实例对象--><script>//创建Vue的实例const vm = new Vue({// el属性是固定写法。// 表示当前的VM实例要控制页面上的哪上区域,收接的是一个选择器。el: "#app",data: {x: '李',m: '华',xm:''},watch:{x:{handler(oldValue,newValue){this.xm=newValue+this.m}},m:{handler(oldValue,newValue){this.xm=this.x+newValue;}}}})</script></body>
</html>

首先我们分析这个需求,如果把这个需求放在计算属性中,我们发现只需要一个计算属性result就可以实现,而监听需要做两个,因为我们要监听的是姓和名两个属性值,这和计算属性和判断依赖项是否改变是不同的,这也决定了它们适用的方向不同。

Watch有几种创建方式

五种:函数、对象、数组、函数名

常用的还是第一种:

watch:{监听属性名:{handler(监听前值,监听后值){代码逻辑}}}

Watch主要内容

handler:回调函数,也就是监听到变化后执行的函数。
deep:确认是否深入监听,假设有个深层对象,当它很多层内的数据发生变化,是否依旧能监听到且执行回调函数,如果想监听到,可以开启深度监听。
immediate:默认是false,false则初始化页面后不调用监听回调函数,true则第一次进入页面就调用回调函数且绑定值。

Watch特性

  • 默认初次进入页面不调监听函数(immediate:true解决)
  • 一个监听函数只能监听一个属性值
  • 默认当对象属性值发生改变不调监听(deep:true解决)
  • 允许执行异步操作,比如调用一个API。

应用场景

  • 一次只能监听一个数据,并处理数据相关的代码逻辑。
  • 百度联想词
  • 复杂的业务逻辑或调用异步API,如AJAX。

computed和Watch区别

下面简称computed为c,Watch为w。

  1. c发生改变是因为依赖项改变,所以它能监听几个属性取决于它有几个依赖属性,所以它能监听一个或多个属性,w一次只能监听一个属性。
  2. 因为c的值是被同步计算出来的,先判断依赖是否改变,改变则计算,计算后缓存,缓存后显示,所以c不能异步操作,w能异步。
  3. c要判断依赖项是否改变,改变后需要计算才能缓存,而watch监听到改变就立刻执行相关操作。
  4. c可以类似data直接访问到,watch不能。
  5. 所以说计算多个属性时可以用computed,监听一个属性或处理异步或逻辑较难业务可以用watch。

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

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

相关文章

【理解ARM架构】操作寄存器实现UART | 段的概念 | IDE背后的命令

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《理解ARM架构》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f360;操作寄存器实现UART&#x1f35f;UART原理&#x1f35f;编程 &#x1f360;…

python——第十二天

内置模块或者其他模块学习方式&#xff1a; dir help os模块负责程序与操作系统的交互&#xff0c;提供了访问操作系统底层的接口&#xff1b;即os模块提供了非常丰富的方法用来处理文件和目录。 os&#xff1a; os.path 遍历C盘代码 import os from os import path def …

修改YOLOv5的模型结构第三弹

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制&#x1f680; 文章来源&#xff1a;K同学的学习圈子 文章目录 任务任务拆解 开始修改C2模块修改yolo.py修改模型配置文件 模型训练 上次已…

【工具使用】Keil工具的使用——常用配置介绍

Keil调试具体教程学习 目录 ​​​​​​​Keil调试具体教程学习 常用功能总结 &#xff08;2&#xff09;目标设置&#xff08;Target&#xff09; ①设置晶振频率 ②跨模块优化选项 ③微库选项 &#xff08;3&#xff09;输出设置&#xff08;Output&#xff09; ①…

插入排序(形象类比)

最近在看riscv手册的时候&#xff0c;里面有一段代码是插入排序&#xff0c;但是单看代码的时候有点迷&#xff0c;没看懂咋操作的&#xff0c;后来又查资料复习了一下&#xff0c;最终才把代码看明白&#xff0c;所以写篇博客记录一下。 插入排序像打扑克牌 这是我听到过比较形…

list的总结

目录 1.什么是list 1.1list 的优势和劣势 优势&#xff1a; 劣势&#xff1a; 2.构造函数 2.1 default (1) 2.2 fill (2) 2.3 range (3) 2.4 copy (4) 3.list iterator的使用 3.1. begin() 3.2. end() 3.3迭代器遍历 4. list容量函数 4.1. empty() 4.2. siz…

语音合成综述Speech Synthesis

一、语音合成概述 语音信号的产生分为两个阶段&#xff0c;信息编码和生理控制。首先在大脑中出现某种想要表达的想法&#xff0c;然后由大脑将其编码为具体的语言文字序列&#xff0c;及语音中可能存在的强调、重读等韵律信息。经过语言的组织&#xff0c;大脑通过控制发音器…

正整数分解

题目编号&#xff1a;Exp08-Basic01&#xff0c;GJBook3-12-05 题目名称&#xff1a;正整数分解 题目描述&#xff1a;正整数n&#xff0c;按第一项递减的顺序依次输出其和等于n的所有不增的正整数和式。 输入&#xff1a;一个正整数n&#xff08;0<n≤15&#xff09;。 …

qRT-PCR相对定量计算详解qPCR相对定量计算方式——2^-(∆∆Ct) deta t

做完转录组分析之后&#xff0c;一般都要求做qRT-PCR来验证二代测序得到的转录本表达是否可靠。荧光定量PCR是一种相对表达定量的方法&#xff0c;他的计算方法有很多&#xff0c;常用的相对定量数据分析方法有双标曲线法&#xff0c;ΔCt法&#xff0c;2^-ΔΔCt法(Livak法)&a…

顺序表基本操作全面解析

文章目录 1.线性表2.顺序表分类2.1 静态顺序表2.2 动态顺序表 3. 顺序表各接口实现1. 定义结构体(Seqlist)2. 结构体初始化(SLInit)3.检查容量 (SLCheckCapacity)4.打印数据 (SLPrintf)5.插入操作5.1 从数据头部插入(SLPushFront)5.2 从数据尾部插入(SLPushBack)5.3 从任意下标…

100天精通Python(可视化篇)——第106天:Pyecharts绘制多种炫酷桑基图参数说明+代码实战

文章目录 专栏导读一、桑基图介绍1. 桑基图是什么?2. 桑基图应用场景?二、桑基图配置选项1. 导包2. add函数3. 分层设置三、桑基图基础1. 普通桑基图2. 修改标签位置3. 修改节点布局方向4、月度开支桑基图书籍推荐专栏导读 🔥🔥本文已收录于《100天精通Python从入门到就…

线性表之顺序表

文章目录 主要内容一.顺序表1.插入操作&#xff1a;代码如下&#xff08;示例&#xff09;: 2.删除操作&#xff1a;代码如下&#xff08;示例&#xff09;: 3.按值查找&#xff1a;代码如下&#xff08;示例&#xff09;: 总结 主要内容 顺序表 预备知识 定义&#xff1a; 线…

GEE:基于 Landst 遥感数据计算的 kNDVI 下载 APP

作者&#xff1a;CSDN _养乐多_ 本文记录了在Google Earth Engine&#xff08;GEE&#xff09;平台中&#xff0c;使用 Landsat 遥感数据计算并且下载 kNDVI 的应用 APP 链接&#xff0c;并介绍该 APP 的使用方法和步骤。该APP可以为用户展示 NDVI 和 kNDVI 的遥感影像&#…

抽象类, 接口, Object类 ---java

目录 一. 抽象类 1.1 抽象类概念 1.2 抽象类语法 1.3 抽象类特性 1.4 抽象类的作用 二. 接口 2.1 接口的概念 2.2 语法规则 2.3 接口的使用 2.4 接口间的继承 2.5 抽象类和接口的区别 三. Object类 3.1 toString() 方法 3.2 对象比较equals()方法 3.3 hash…

免费获取GPT-4的五种工具

不可否认&#xff0c;由OpenAI带来的GPT-4已是全球最受欢迎的、功能最强大的大语言模型&#xff08;LLM&#xff09;之一。大多数人都需要使用ChatGPT Plus的订阅服务去访问GPT-4。为此&#xff0c;他们通常需要每月支付20美元。那么问题来了&#xff0c;如果您不想每月有这笔支…

基于JavaWeb+SpringBoot+Vue医院管理系统小程序的设计和实现

基于JavaWebSpringBootVue医院管理系统小程序的设计和实现 源码获取入口Lun文目录前言主要技术系统设计功能截图订阅经典源码专栏[Java 源码获取 源码获取入口 Lun文目录 目录 1系统概述 1 1.1 研究背景 1 1.2研究目的 1 1.3系统设计思想 1 2相关技术 2 2.1微信小程序 2 2.2 …

井盖位移传感器厂家批发,守护井盖安全

窨井盖广泛分布于城市街道&#xff0c;其管理效果直接反映了城市治理的现代化程度。根据住房和城乡建设部发布的《关于进一步加强城市窨井盖安全管理的通知》&#xff0c;全国各地需加强窨井盖的安全管理。作为市政基础设施的一个重要的组成部分&#xff0c;井盖的管理工作不仅…

去水印网站哪个好?试试这个去水印软件!

在工作中&#xff0c;我们都曾遇到过图片水印的困扰。在众多的在线水印去除工具中&#xff0c;虽然选择看似丰富&#xff0c;但往往很难找到完全满足我们需求的那一个。有些工具操作过程繁复&#xff0c;有些工具在处理复杂水印时力不从心&#xff0c;还有些工具在去水印的过程…

【Spring日志】

一.日志作用 1.定位和发现问题 这是日志的主要用途,通过查看日志,我们可以定位问题发生的位置,从而快速的发现问题,分析问题. 2.系统监控 监控几乎是一个成熟系统的标配,我们可以通过日志记录这个系统的运行状态,比如记录方法的响应时间,响应状态,通过设置不同的规则,超过阈值就…

【MyBatis <if> <where>标签介绍】

文章目录 <if>标签<where>标签<foreach>标签 <if>标签 <if>标签允许我们在SQL语句中添加条件判断。 <if test"condition"><!-- 当条件满足时执行的SQL语句 --> </if>其中&#xff0c;test属性是一个表达式&#x…