Vue 基础自查——watch、computed和methods的区别
1 前言
创建一个Vue实例时,可以传入一个选项对象
const vm = new Vue({
data: {
msg: 'hello'
},
computed: {},
methods: {},
watch: {}
})
这个选项对象可以指定非常多的选项(或者说属性),和数据相关的选项有:包括但不限于data
、methods
、computed
、watch
等等
其中methods
、computed
、watch
都能通过函数来对数据进行处理或作出响应,这三者有差异,但很容易混淆
2 基础用法
用script
引入vue.js
,下面的代码都在如下html
中运行
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Methods</title>
<!-- 引入 vue.js -->
<script src="https://cdn.jsdelivr.net/npm/vue@2.6.14/dist/vue.js"></script>
</head>
<body>
</body>
<script>
</script>
</html>
2.1 methods 方法
methods
选项中的定义的函数称为方法,在Vue实例化的过程中,methods
对象中的方法将被混入到Vue实例中,成为Vue实例的方法。可以直接通过Vue实例访问这些方法
<body>
<div id="example">
<!-- 显示:a:1 -->
<p>a:{{ plus() }}</p>
</div>
</body>
<script>
const vm = new Vue({
el: "#example",
data: {
a: 0,
},
methods: {
plus: function () {
return this.a + 1;
},
},
});
console.log(vm); // 查看控制台输出的vm,可以看到它有一个方法是:plus: ƒ (),️注意是方法
console.log(vm.plus()); // 直接通过vm实例访问方法,输出:1
</script>
需要主动调用methods
中的函数才能执行,a
的值改变并不能让页面中的<p>a:{{plus()}}</a>
跟着更新
2.2 computed 计算属性
computed
选项中定义的函数称为计算属性,在Vue实例化的过程中,computed
对象中的计算属性将被混入到Vue实例中,成为Vue实例的同名属性。
<body>
<div id="example">
<!-- 显示:a:1 -->
<p>a:{{ plus }}</p>
</div>
</body>
<script>
const vm = new Vue({
el: "#example",
data: {
a: 0,
},
computed: {
plus: function () {
return this.a + 1;
},
},
});
console.log(vm); // // 查看控制台输出的vm,可以看到它有一个属性是:plus:1,️注意是属性
</script>
乍一看好像computed
和methods
功能一样,确实在这个例子中二者展示效果相同
事实上通过打印vm
实例以及访问方式已经体现出二者的一个不同之处:
methods
中的函数会成为vm
的方法- 而
computed
中的函数经过计算后会成为vm
的同名属性,属性值为函数的计算结果,即返回值
另外,和方法不同的是,计算属性能够跟着它依赖的数据变化而进行响应式更新,即a
变化时,plus
属性也会更新
2.3 watch 侦听器
watch
选项中的键值对称为侦听器或者说监听属性/监听属性,键是需要观察的表达式,值是对应的回调函数(值还可以是其他形式,此处不展开)
在Vue实例化的过程中,这些需要侦听的变量会被记录下来,当这些变量发生变化的时候,对应的回调函数就会执行
<body>
<div id="example">
<!-- 显示:a:1 -->
<p>a:{{ a }}</p>
</div>
</body>
<script>
const vm = new Vue({
el: "#example",
data: {
a: 0,
},
watch: {
a: function () {
console.log("a发生了变化"); // 因为a的值变了,回调函数执行
console.log(this.a);
},
},
});
vm.a = 1; // 这里直接手动改变a的值
</script>
3 三者的区别
3.1 方法 VS 计算属性
除了2.2
中已经提到的两点区别之外,还有最重要的区别是:
计算属性是基于它们的响应式依赖进行缓存的
即上文中的
a
发生变化时,才会重新触发求值函数,否则多次调用都会从缓存中求值这对开销较大的计算来说非常有用,可以避免重复计算
方法则是调用时总会重新执行
下面用表格的形式对这两者的区别进行总结:
methods | computed | |
---|---|---|
Vue实例化后成为vm实例的什么 | 成为vm实例上的方法 | 成为vm实例上的属性 |
能否根据依赖的数据进行响应式更新 | 不能,需要主动调用方法 | 能 |
能否缓存 | 不能,每次调用重新执行 | 能,依赖的数据不变,会从缓存中取值 |
3.2 计算属性 VS 侦听器
首先最明显的区别,侦听器的命名方式是固定的,想要监听谁,就和谁同名。而方法和计算属性可任意命名
其次,侦听器无法主动进行访问,而另外两者都能主动访问
计算属性和侦听器的使用场景:
如果某个值需要通过一个或多个数据计算得到,就使用计算属性
侦听属性主要是监听某个值的变化,然后进行需要的逻辑处理;此外当需要在数据变化时执行异步或开销较大的操作时,侦听属性就比较有用,具体例子可见vue文档-侦听器
Vue 基础自查——watch、computed和methods的区别的更多相关文章
- Vue.js 计算属性computed和methods的区别
在vue.js中,有methods和computed两种方式来动态当作方法来用的 如下: 两种方式在这种情况下的结果是一样的 写法上的区别是computed计算属性的方式在用属性时不用加(),而met ...
- Vue.js中 computed 和 methods 的区别
官方文档中已经有对其的解释了,在这里把我的理解记录一下Vue中的methods.watch.computed computed 的使用场景 HTML模板中的复杂逻辑表达式,为了防止逻辑过重导致不易维护 ...
- vue计算属性computed和methods的区别
computed和methods的区别 在new Vue的配置参数中的computed和methods都可以处理大量的逻辑代码,但是什么时候用哪个属性,要好好区分一下才能做到正确的运用vue. com ...
- vue系列---理解Vue中的computed,watch,methods的区别及源码实现(六)
_ 阅读目录 一. 理解Vue中的computed用法 二:computed 和 methods的区别? 三:Vue中的watch的用法 四:computed的基本原理及源码实现 回到顶部 一. 理解 ...
- Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别
Vue – 基础学习(3):$forceUpdate()和$nextTick()的区别
- watch、computed、methods的区别
1. `computed`属性的结果会被缓存,除非依赖的响应式属性变化才会重新计算.主要当作属性来使用,要return出去一个值:2. `methods`方法表示一个具体的操作,主要书写业务逻辑:3. ...
- Vue 基础自查——条件渲染和列表渲染
v-if和v-show的区别是什么? v-if和v-for为什么不能一起用? v-for中的key有什么作用? 1 v-if 和 v-show 1.1 作用 都用来控制元素的显示和隐藏 1.2 控制元 ...
- Vue中 computed 和 methods的区别
涉及到计算部分的时候,计算属性是基于它们的依赖进行缓存的,如果说值不变,那么它就不会去重新执行,只有当值发生了改变,它才会去重新执行一次,其它时候它都是缓存的.而方法则会反复计算处理.二者之间的差距就 ...
- vue.js中的computed和watch的区别
1.computed在调用时不需要加(),watch是不需要调用的2.computed如果属性没有发生改变时会从缓存中读取值,watch当属性发生改变时会接收到2个值:一个为新值,一个为旧值3.com ...
随机推荐
- linux 服务器资源 监控工具
工具一:vmstat(服务端) 一.vmstat选项参数解释 -V:显示vmstat版本信息 -n:只在开始时显示一次各字段名称 -a:显示活跃和非活跃内存 -d:显示各个磁盘相关统计信息 -D:显示 ...
- 对OOP的理解
OOP是面向对象编程Object Oriented Programming,特征分别是封装.继承.多态.抽象. 封装:封装是指将对象信息状态通过访问权限修饰符隐藏在对象内部,不允许外部程序直接访问,如 ...
- 鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射 | 百篇博客分析OpenHarmony源码 | v42.02
百篇博客系列篇.本篇为: v42.xx 鸿蒙内核源码分析(中断切换篇) | 系统因中断活力四射 | 51.c.h .o 硬件架构相关篇为: v22.xx 鸿蒙内核源码分析(汇编基础篇) | CPU在哪 ...
- IdentityServer4[5]简化模式
Implicit简化模式(直接通过浏览器的链接跳转申请令牌) 简化模式是相对于授权码模式而言的.其不再需要[Client]的参与,所有的认证和授权都是通过浏览器来完成的. 创建项目 IdentityS ...
- 【C++ Primer Plus】编程练习答案——第7章
1 double ch7_1_harmonicaverage(double a, double b) { 2 return 2 / (1 / a + 1 / b); 3 } 4 5 void ch7_ ...
- 获取HTML网页中option标签元素的值
在进行表单元素的操作时,难免会遇到对option元素的挑选,下面的示例代码能够很好的获取到你option元素选择的值,如果要传递给后端,可通过ajax或者其他方式传递即可. 示例代码 <!doc ...
- NER为什么那么难
命名实体识别(Name Entity Recognition) 是自然语言处理中一个比较基础的问题.要解决的问题是,从unstructure的文本当中找到实体并归类.当然我这么定义已经有了一定的bia ...
- DL4J实战之三:经典卷积实例(LeNet-5)
欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...
- Go语言核心36讲(Go语言基础知识四)--学习笔记
04 | 程序实体的那些事儿(上) 还记得吗?Go 语言中的程序实体包括变量.常量.函数.结构体和接口. Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予 ...
- NOI 2017 Day1 题解
被虐爆了... T1 整数 题目传送门 Description 有一个整数 \(x\),有 \(n\) 此操作,每次操作为以下两种情况: 给出 \(a,b\),将 \(x\) 加上 \(a\times ...