vue computed使用_vue computed正确使用方式

7653ab76ac5b2e93fb1d92725a6dcd92.png
最近面试中,遇到一个小伙子,谈到了vue中的 computedwatch 区别,最后得到了一个让我瞠目结舌的答案,只用 watch,从不用 computed

模板内的表达式非常便利,但是设计它们的初衷是用于简单运算的。在模板中放入太多的逻辑会让模板过重且难以维护,所以,对于复杂逻辑,vue 提倡使用计算属性。需要特别说明:计算属性的 getter 函数是没有副作用 (side effect) 的,这使它更易于测试和理解 — from Vue计算属性

讨论 computedwatch 之间的区别前,我们先看下 computedmethods 有何区别?

computed or methods

理论上,computed 所有实现可以使用 methods 完全替换。

<p>Reversed message: "{{ reversedMessage() }}"</p>
<p>Reversed message: "{{ reversedMessage }}"</p>
// 计算属性
computed: {reversedMessage () {return this.message.split('').reverse().join('')}
}
// 方法
methods: {reversedMessage: function () {return this.message.split('').reverse().join('')}
}

计算属性是基于它们的响应式依赖进行缓存的。只在相关响应式依赖发生改变时它们才会重新求值。这就意味着只要 message 还没有发生改变,多次访问 reversedMessage计算属性会立即返回之前的计算结果,而不必再次执行函数。而方法却会执行。

这也同样意味着下面的计算属性将不再更新,因为 Date.now() 不是响应式依赖:

computed: {now: function () {return Date.now()}
}

我们为什么需要缓存?假设我们有一个性能开销比较大的计算属性 A,它需要遍历一个巨大的数组并做大量的计算。然后我们可能有其他的计算属性依赖于 A 。如果没有缓存,我们将不可避免的多次执行 A 的 getter!如果你不希望有缓存,请用方法来替代。

相同之处: computedmethods 将被混入到 Vue 实例中。vm.reversedMessage/vm.reversedMessage() 即可获取相关计算属性/方法。

接下来,看下 computedwatch 有何区别?

computed or watch

Vue 提供了一种更通用的方式来观察和响应 Vue 实例上的数据变动:侦听属性。当你有一些数据需要随着其它数据变动而变动时,你很容易滥用 watch,然而,通常更好的做法是使用计算属性而不是命令式的 watch 回调。

当需要在数据变化时执行异步或开销较大的操作时, watch 方式是最有用的。其允许我们执行异步操作 (访问一个 API),限制我们执行该操作的频率,并在我们得到最终结果前,设置中间状态。这些都是计算属性无法做到的。

methods: {getAnswer: function () {this.answer = 'Thinking...'var vm = thisaxios.get('https://yesno.wtf/api').then(function (response) {vm.answer = _.capitalize(response.data.answer)}).catch(function (error) {vm.answer = 'Error! Could not reach the API. ' + error})}
},
created: function () {// debounce 反弹函数this.debouncedGetAnswer = _.debounce(this.getAnswer, 500)
}
这样来看,watch 完全可以替代 computed ?什么情况下,只能使用computed呢?

回顾 computed 最大特点就是缓存,所以上述问题可以转换为:哪些情况下,我们需要依赖缓存?

示例:父组件给子组件传值,值的类型为引用类型

父组件

<template><div><child :user="user"></child><label for="user">parent:</label><input id="user" type="text" v-model="user.name"></div>
</template>
<script>
import Child from './child.vue'
export default {data () {return {user: { name: 'ligang' }}},components: { Child }
}
</script>

子组件

<template><div>child: {{user}}</div>
</template>
<script>
export default {name: 'child',props: ['user']
}
</script>

现在有这样一个需求,子组件中需要同时显示改变前和改变后的值。

So Easy,只需要在 watch 中保存 oldVal 即可。

<template><div><div>child:</div><div>修改前:{{oldUser}} 修改后:{{user}}</div></div>
</template>
<script>
export default {name: 'child',props: ['user'],data () {return {oldUser: {}}},watch: {user: {handler (val, oldVal) {this.oldUser = oldVal || val},deep: true,immediate: true}}
}
</script>

查看结果,WTF,啥情况~~

e15cd9fdbbab2dc236db89493d86fca6.png
示例

问题在于,user为引用类型,且 watch 没有做缓存,导致了修改的是同一个对象,所以,watch 方法中val === olVal is true!!

如何达到要求呢,这里我们就可以借用 computed 缓存的特性,来完成上述情况。

计算属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算。注意,如果某个依赖 (比如非响应式属性) 在该实例范畴之外,则计算属性是不会被更新的。 — vue-computed-api

<template><div><div>child:</div><div>修改前:{{oldUser}} 修改后:{{user}}</div></div>
</template>
<script>
export default {name: 'child',props: ['user'],data () {return {oldUser: {}}},// 缓存 userInfo   computed: {userInfo () {return { ...this.user }}},watch: {userInfo: {handler (val, oldVal) {this.oldUser = oldVal || val},deep: true,immediate: true}}
}
</script>

需要注意:{ ...this.user } 或者使用 Object.assign({}, this.user) 来创建新的引用!

欢迎关注 「 Super 前端 」微信公众号

b2d81dbff2575ef8fdbb53eb1e89491b.png
版权声明:
本文原创自我的博客李刚的学习专栏

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

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

相关文章

[html] 如何设置打印尺寸?

[html] 如何设置打印尺寸&#xff1f; 用一个单独的Css文件设置打印样式个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

db2 建库

建库 CREATE DATABASE TS1AUTOMATIC STORAGE NO --是否自动存储ON D:\ --路径ALIAS testUSING CODESET GBK --设置编码TERRITORY CN COLLATE --设置地域USING SYSTEM PAGESIZE 4096 --设置数据页大小(4kb 8kb 16kb 32kb)WITH aa --注释 建表----------------------------------…

python读取扫描形成的pdf_Python利用PyPDF2库获取PDF文件总页码实例

Python中可以利用PyPDF2库来获取该pdf文件的总页码&#xff0c;可以根据下面的方法一步步进行下去&#xff1a;1、首先&#xff0c;要安装PyPDF2库&#xff0c;利用以下命令即可&#xff1a;pip install PyPDF22、接着&#xff0c;就是直接编写代码了&#xff0c;其中我新建了一…

Apache实验-目录别名

一、作用介绍 在一些情况下&#xff0c;我们的资源文件都在非/var/www/html目录下&#xff0c;例如/var/www/html/sohu。这样的话我们在输入网址的时候就需要在网站根目录下再输入完整的目录。所以我们可以定义一个别名来替代这个路径。可以简写网站的网址。 二、实例操作 目前…

python123第三周测验答案_python123 测验3: 基本数据类型 (第3周)

1.‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‭‬‪‬‪‬‪‬‪‬‪‬‮‬‪‬‫‬# pow(x, 0.5)能够计算x的平方根&#xff0c;计算负数的平方根将产生&#xff1a;‪‬‪‬‪‬‪‬‪…

[html] 说下你对组件、模块、元素的理解,它们的区别在哪里?

[html] 说下你对组件、模块、元素的理解&#xff0c;它们的区别在哪里&#xff1f; 元素&#xff1a;元素是网页的一部分&#xff0c;在 XML 和 HTML 中&#xff0c;一个元素可以包含一个数据详情或者是一块文本或者是一张照片&#xff0c;亦或是什么也不包含。 一个典型的元素…

python中spark有什么功能_Spark SQL是什么,提供的主要功能有哪三种?

Spark SQL允许大家在Python、Java以及Scala中使用数据帧;利用多种结构化格式读取并写入数据;通过SQL进行大数据查询。Spark SQL属于Spark用于处理结构化与半结构化数据的接口。结构化数据是指那些拥有一定模式的数据&#xff0c;包括JSON、Hive Tables以及Parquet。模式意味着每…

黑苹果适合什么用途?_黑苹果系统,Ozmosis和四叶草、变色龙相比有什么区别和优势?...

黑苹果单系统&#xff0c;Ozmosis和四叶草、变色龙相比有什么区别和优势&#xff1f;黑苹果系统用于影视后期处理ozmosis由于调试灵活性差&#xff0c;每次调试都要刷bios&#xff0c;主板厂商提供的bios也就8mb&#xff0c;要把&#xff0c;ozmosis引导程序放进去&#xff0c;…

Apache的虚拟主机

一、虚拟主机的分类 基于IP的虚拟主机&#xff1a;一台服务器&#xff0c;多个ip&#xff0c;搭建多个网站 基于端口的虚拟主机&#xff1a;一台服务器&#xff0c;一个ip&#xff0c;利用不同端口&#xff0c;搭建多个网站 基于域名的虚拟主机&#xff1a;一台服务器&#xff…

[html] 给一个元素加下划线的方法有哪些?

[html] 给一个元素加下划线的方法有哪些&#xff1f; 使用 <u></u> 标签给元素添加 boder-bottom文字样式 text-decoration: underline;使用伪类或者子元素做绝对定位.target {position: relative; } .underline {position: absolute;bottom: 0;left: 0;right: 0;h…

使用Vim,让你工作效率更高

光标移动 w  移动至下一个单词的开头 b  移动至上一个单词的开头 e  移动至下一个单词的结尾 ge  移动至上一个单词的结尾 0  移动至一行开头 $  移动至一行结尾 f{char}  移动到char上  gg  文件开头 G  文件尾部 :ju  打印跳转列表 CTRL-O  跳至跳转列…

python数字转日期函数_【转】Python 日期和时间

本文转自&#xff1a;http://www.runoob.com/python/python-date-time.htmlPython 程序能用很多方式处理日期和时间&#xff0c;转换日期格式是一个常见的功能。Python 提供了一个 time 和 calendar 模块可以用于格式化日期和时间。时间间隔是以秒为单位的浮点小数。每个时间戳…

zabbix解决中文乱码

解决中文乱码 yum install -y wqy-microhei-fonts #解决方法 中文乱码 \cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf #或者是服务器没有安装中文转载于:https://www.cnblogs.com/zhaojingyu/p/11438733.html

[html] input元素size属性和width 的区别是什么?

[html] input元素size属性和width 的区别是什么&#xff1f; size:在MDN的定义&#xff1a;控件的初始大小。以像素为单位。但当type 属性为text 或 password时, 它表示输入的字符的长度。从HTML5开始, 此属性仅适用于当 type 属性为 text, search, tel, url, email,或 passwo…

[zz]linux下DHCP服务器配置(使用Ubuntu LTS 8.04)

linux下DHCP服务器配置&#xff08;使用Ubuntu LTS 8.04&#xff09; 转载请注明 原文&#xff1a;http://blog.csdn.net/xl_xunzhao/archive/2008/10/09/3044502.aspx xunzhao的博客已搬家至&#xff1a;http://xunzhaoxz.itpub.net 系统环境&#xff1a;Ubuntu 8.04 LTS服务器…

springboot启动过程_spring5/springboot2源码学习 -- spring boot 应用的启动过程

推荐阅读&#xff1a;Spring全家桶笔记&#xff1a;SpringSpring BootSpring CloudSpring MVC疫情期间“闭关修炼”&#xff0c;吃透这本Java核心知识&#xff0c;跳槽面试不心慌2020“闭关”跳槽季&#xff0c;啃透分布式三大技术&#xff1a;限流、缓存、通讯基本环境开发工具…

python concat去除重复值语句_Python数据处理从零开始----第二章(pandas)④数据合并和处理重复值...

目录第二章(pandas)Python数据处理从零开始----第二章(pandas)④数据合并和处理重复值数据合并在数据处理中&#xff0c;通常将原始数据分开几个部分进行处理而得到相似结构的Series或DataFrame对象&#xff0c;我们该如何进行纵向合并它们&#xff1f;这时我们可以选择用pd.co…

[html] noscript标签有什么作用?

[html] noscript标签有什么作用&#xff1f; noscript 标签用于当浏览器不支持 JS 的时候在页面上显示一些提示内容&#xff0c;但是也有一些缺点&#xff0c;比如如果是防火墙而不是浏览器禁用了 JS&#xff0c;非但 JS 执行不了&#xff0c;noscript 的内容也不会显示。比较…

ntp时间同步

一、NTP服务器就是利用NTP协议提供时间同步服务的 二、安装 # 系统自带ntp [rootoldboyedu ~]# rpm -qa ntp ntp-4.2.6p5-5.el6.centos.x86_64 # 如果没有就安装 yum -y install ntp三、配置ntp [rootVM-0-14 ~]# vim /etc/ntp.conf # restrict default kod nomodify notrap no…

不出来信号 quartus_男人一旦动了真情,会向你发出这6个“信号”不爱的人装不出来...

恋爱的时候&#xff0c;女人都想知道一个男人是否真的爱你&#xff0c;是否真的在乎你&#xff0c;女人常常在猜测男人的心思。而对一个聪明的女人来说&#xff0c;她们会用眼睛&#xff0c;用心观察身边的那个男人。有人说如果男人对女人动了真情&#xff0c;他会在女人面前表…