各自的适用场景

计算属性临时快照

官方文档对于计算属性提到了一个重要的点子——“临时快照”(可能就是前面说的计算属性缓存),每当源状态发生变化时,就会创建一个新的快照。

有时候创建快照是没有意义的,对于间隔时间很短的源数据修改,比如输入框输入时页面上的一些变化。输入第一个字符到第二个字符之间的间隔时间,字符有长有短,每一次都要创建“临时快照”,这样是没有意义的,反而可能增加开销。

计算属性除了可以用于复杂的模板取值计算(普通函数也可以做,也不是它的特性),还可以计算一次而在页面上多次使用(这是计算属性的“临时快照”的优势)。

监听器的副作用

因此,上面说到的情况就更加适合用监听器来做,监听器不创建“临时快照”。监听器更适用于官方文档说的场景:“我们需要在状态变化时执行一些‘副作用’:例如更改 DOM,或是根据异步操作的结果去修改另一处的状态”。

监听器的副作用就是被监测的数据源发生变化才被触发,而不能被其他数据源发生变化而受到影响。具体往下看,就是我说的监听器单一性。

深入思考两者区别

计算属性由于在计算过程中依赖了很多响应式数据,一旦某一个响应式数据发生变化,那么整个计算属性都将重新计算。我就自以为计算属性有共享性。

虽然监听器也可以依赖于很多响应式数据,但是监听器只负责一个数据源,而被依赖的其他响应式数据一旦发生变化,都无法触发这个监听器,即监听器的单一性。

监听器:单一性

Talk is cheap. Show me the code.

定义两个输入框需要绑定的响应式数据 inputcopyInput,监听器只负责监听 input,当监听器被触发时,新的值将赋值给 input,并且 input 也拼接给 copyInput(这里为了让两个产生联系而设计的无脑代码):

let input = ref("");
let copyInput = ref(""); watch(input, (newVal, oldVal) => {
input.value = newVal;
copyInput.value += input.value;
console.log("input value has changed.");
});

输入框绑定响应式数据,页面展示 copyInput:

<div class="demo1">
<div>CopyInput Value: {{ copyInput }}</div>
<div>
<span>Input: </span>
<input v-model="input" />
</div>
<div>
<span>CopyInput: </span>
<input v-model="copyInput" />
</div>
</div>

第一个输入框内(即绑定 input 的输入框)输入三次,监听器被触发 3 次,当第二个输入框的数据发生变化时,控制台不打印,也就是说,监听器里面被依赖的数据没有因为改变而被触发。

计算属性:共享性

计算属性里面被依赖的其中一个响应式数据发生了变化,整个计算属性都将被重新计算。那么,计算属性是否和上面提到的监听器一样呢?

let input = ref("");
let copyInput = ref(""); const result = computed(() => {
console.log("computed has changed.");
return (copyInput.value += input.value);
});
<div class="demo2">
<div>CopyInput Value Result: {{ result }}</div>
<div>
<span>Input: </span>
<input v-model="input" />
</div>
<div>
<span>CopyInput: </span>
<input v-model="copyInput" />
</div>
</div>

不管我改哪一个,只要是被计算属性依赖的数据源发生改变,这个计算属性都被触发,即共享性:

总结

(1)计算属性适合数据源发生变化间隔长,且页面使用它的次数多的情况;监听器适合数据源发生变化间隔短,或有异步操作,或有副作用的情况。

(2)如果不想其他响应式数据发生变化而导致被监测的源数据发生变化,那么就使用监听器。如果其他响应式数据发生变化,而被监测的源数据也一同发生变化,那么就使用计算属性。

声明

文章中所说的计算属性具有共享性和监听器具有单一性是为了方便理解他们之间的不同,博主擅自给的定义,可能存在不严谨的地方。

  1. 计算属性具有共享性:指的是计算属性里面的被依赖的响应式数据只要有一个发生变化,整一个计算属性都重新计算,牵一发而动全身。
  2. 监听器具有单一性:指的是监听器只负责它监听的那个数据源,如果发生变化,才会被触发,如果里面被依赖的其他数据源发生变化时,这个监听器不会被触发。

以上证明了我所阐述的观点,如果你有收货,请给我点个赞+收藏吧!

Vue 监听器和计算属性到底有什么不同?的更多相关文章

  1. vue监听器watch & 计算属性computed

    侦听器watch vue中watch是用来监听vue实例中的数据变化 watch监听时有几个属性: handle:其值是一个回调函数,就是监听对象对话的时候需要执行的函数 deep:其值true 或者 ...

  2. Vue的computed计算属性是如何实现的

    一个开始 有如下代码,full是一个计算属性,开始,他的值是'hello world',1s后,msg变成了‘I like’, full的值同步变成了'I like world';其原理解析来看一下. ...

  3. Vue学习之vue中的计算属性和侦听器

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  4. Vue(基础三)_监听器与计算属性

    一.前言 本文主要涉及:     1.watch()监听单个属性 2.computed可以监听多个属性 3.点击li标签切换音乐案例 二.主要内容 1.watch()监听器(监听单一数据) (1)监听 ...

  5. Vue中的计算属性和监听器(computed 与 watch)

    react中数据是单向绑定的,而vue中数据是双向绑定的.为什么? 在react中,主要是通过setState 去改变state的值:而在vue中,会自动的触发set 与get 改变属性的值. 在vu ...

  6. Vue基础之计算属性

    适用场景 设想一个场景,你需要得到一个复杂运算/逻辑的返回值,利用模板内的表达又过长且难以阅读和维护,这时计算属性就可以很好的解决你的问题.看下面的例子: <!DOCTYPE html> ...

  7. 关于vue.js的计算属性练习代码

    参照官网联系如下: <!DOCTYPE html><html lang="en"><head> <meta charset="U ...

  8. Vue 过滤器与计算属性

    过滤器 V1.x 版本 过滤器基础 过滤器是一个通过输入数据,能够及时对数据进行处理并返回一个数据结果的简单函数.Vue有很多很便利的过滤器,可以参考官方文档,http://cn.vuejs.org/ ...

  9. vue学习笔记 计算属性(四)

    计算属性就是vue实例里的computed属性,对应一个对象,里面可以放各种方法,方法的作用就是可以生成和数据变量对应的计算后的变量,跟数据相关的复杂逻辑变量,都可以使用计算属性实现,computed ...

随机推荐

  1. GitHub 官方大动作频频「GitHub 热点速览 v.22.24」

    作者:HelloGitHub-小鱼干 本周 GitHub 官方 Blog 很是热闹,GitHub 官方大动作频频也带来了 GitHub Blog 的频繁更新,除了本周 News 快读收录的 GitHu ...

  2. 关于缓存一致性协议、MESI、StoreBuffer、InvalidateQueue、内存屏障、Lock指令和JMM的那点事

    前言 事情是这样的,一位读者看了我的一篇文章,不认同我文章里面的观点,于是有了下面的交流. 可能是我发的那个狗头的表情,让这位读者认为我不尊重他.于是,这位读者一气之下把我删掉了,在删好友之前,还叫我 ...

  3. SQL注入漏洞篇

    一篇SQL注入漏洞汇总,更新中-- 如有缺陷 望大佬指正 SQL注入产生的原因? 当程序执行逻辑时没有对用户输入的参数做过滤处理,使参数直接与后台数据库产生逻辑交互,即SQL注入黑客就可以利用各种SQ ...

  4. 【机器学习】数据准备--python爬虫

    前言 我们在学习机器学习相关内容时,一般是不需要我们自己去爬取数据的,因为很多的算法学习很友好的帮助我们打包好了相关数据,但是这并不代表我们不需要进行学习和了解相关知识.在这里我们了解三种数据的爬取: ...

  5. 从0到1搭建一款页面自适应组件(Vue.js)

    组件将根据屏幕比例及当前浏览器窗口大小,自动进行缩放处理. 建议在组件内使用百分比搭配flex进行布局,以便于在不同的分辨率下得到较为一致的展示效果.使用前请注意将body的margin设为0,否则会 ...

  6. NC18979 毒瘤xor

    NC18979 毒瘤xor 题目 题目描述 小a有 \(N\) 个数 \(a_1, a_2, ..., a_N\) ,给出 \(q\) 个询问,每次询问给出区间 \([L, R]\) ,现在请你找到一 ...

  7. 《Domain Agnostic Learning with Disentangled Representations》ICML 2019

    这篇文章是ICML 2019上一篇做域适应的文章,无监督域适应研究的问题是如何把源域上训练的模型结合无lable的目标域数据使得该模型在目标域上有良好的表现.之前的研究都有个假设,就是数据来自哪个域是 ...

  8. Iterator接口介绍和迭代器的代码实现

    定义:Iterator接口是Java集合框架中的一员. 作用:Collection接口与Map接口主要用于存储元素. 常用方法:  boolen hasNext();    //判断游标右边是否还有元 ...

  9. OutputStreamWriter介绍&代码实现和InputStreamReader介绍&代码实现

    java.io.OutputStreamWriter extends Writer OutputStreamWriter: 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编 ...

  10. 年中盘点 | 2022年,PaaS 再升级

    作者丨刘世民(Sammy Liu)全文共7741个字,预计阅读需要15分钟 过去十五年,是云计算从无到有突飞猛进的十五年.PaaS作为云计算的重要组成部分,在伴随着云计算高速发展的同时,在云计算产业链 ...