methods,watch和computed都是以函数为基础的,但各自却都不同;

1.watchcomputed都是以Vue的依赖追踪机制为基础的,它们都试图处理这样一件事情:当某一个数据(称它为依赖数据)发生变化的时候,所有依赖这个数据的“相关”数据“自动”发生变化,也就是自动调用相关的函数去实现数据的变动。

2.对methods:methods里面是用来定义函数的,很显然,它需要手动调用才能执行。
  而不像watchcomputed那样,“自动执行”预先定义的函数

3.computed 对象内的方法如果在初始化绑定到元素上的事件先执行一次这个方法 ,而 methods 内的方法则不会;

【总结】:methods里面定义的函数,是需要主动调用的,而和watch和computed相关的函数,会自动调用,完成我们希望完成的作用

从性质上看:

1.methods里面定义的是函数,methods是方法,只要调用它,函数就会执行;

2.computed是计算属性,事实上和和data对象里的数据属性是同一类的(使用上),

<p>原始数据:{{msg}}</p>
<p>改变后的数据:{{changemsg}}</p> var vm=new Vue({
el:"#example",
data:{
msg:"hello",
},
computed:{ //计算属性
changemsg:function(){
return this.msg.split("").reverse().join("");
},
}

你在取用的时候,用this.changemsg去取用,就和取data一样(不要当成函数调用!!)

computed属性  VS watched 属性:

watch和computed各自处理的数据关系场景不同

1.watch擅长处理的场景:一个数据影响多个数据

2.computed擅长处理的场景:一个数据受多个数据影响

watched属性:代码更易于理解,它指定监测的值是谁,然后相应的改变其他的值。

var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar',
fullName: 'Foo Bar'
},
watch: {
firstName: function (val) {
this.fullName = val + ' ' + this.lastName
},
lastName: function (val) {
this.fullName = this.firstName + ' ' + val
}
}
})

computed属性:

var vm = new Vue({
el: '#demo',
data: {
firstName: 'Foo',
lastName: 'Bar'
},
computed: {
fullName: function () {
return this.firstName + ' ' + this.lastName
}
}
})

需要注意的是,

methods调用的方法是没有缓存

computed调用的方法是有缓存,如果之前调用过,则直接返回结果而不是重复计算

<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<div id="app">
<div>
{{ message.split('').reverse().join('') }}
</div>
<h2>计算属性</h2>
<div>
<p>Original message: "{{ message }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
<button @click="change()">改变</button>
</div>
<h2>计算属性缓存 vs 方法</h2>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
<p>Computed reversed message: "{{ reversedMessage }}"</p>
<p>Reversed message: "{{ reversedMessage2() }}"</p>
<p>Reversed message: "{{ reversedMessage2() }}"</p> </div>
<script type="text/javascript" src="js/vue2.6.js"></script>
<script type="text/javascript">
let count=1;
let vm=new Vue({
el:'#app',
data:{
message: 'Hello'
},
computed:{
// 计算属性的 getter
reversedMessage(){
count++;
// `this` 指向 vm 实例
return count+''+this.message.split('').reverse().join('')
}
},
methods:{
change(){
this.message="fdafdafsda";
}, reversedMessage2() {
count++;
return count+''+this.message.split('').reverse().join('')
}
}
}) </script>
</body>
</html>

原文出处:

https://my.oschina.net/u/3649083/blog/1560106

http://blog.java1234.com/blog/articles/533.html

最新文章

  1. 使用vs中的发布功能发布asp.net core项目时遇到ERROR_CERTIFICATE_VALIDATION_FAILED错误
  2. LINUX 下Open cv练习使用小记(1)
  3. IDEA【 MyBatis Plugin】 插件免费完美运行
  4. Leetcode 160 Intersection of Two Linked Lists 单向链表
  5. fopen vs fsocketopen vs curl
  6. Android自定义“图片+文字”控件四种实现方法之 二--------个人最推荐的一种
  7. USB HID介绍
  8. 根据控件Id得到控件
  9. Oulipo HDU 1686 KMP模板
  10. js的DOM操作
  11. NotePad++ 正则表达式替换 高级用法 [转]
  12. HTTP协议的简单介绍
  13. 【工作查漏补缺】jQuery ajax - serializeArray()
  14. SharePoint代码建表(实战)
  15. 【CTSC2016】时空旅行
  16. [Swift]LeetCode375. 猜数字大小 II | Guess Number Higher or Lower II
  17. Ajax与JSON共同使用的小实例
  18. 2017UGUI之slider
  19. 给 datepicker 设定日期格式
  20. ERP简介(一)

热门文章

  1. vscode源码分析【六】服务实例化和单例的实现
  2. Python连载44-XML其他注意点
  3. es6模板字符串使用使${} 来包裹一个变量或者一个表达式
  4. 融云技术分享:融云安卓端IM产品的网络链路保活技术实践
  5. PHPexcel导入数据的时候出现object解决方法
  6. MySQL for OPS 12:锁处理
  7. .net 通过反射实现两个相同结构实体类的转换
  8. 自学_HTML&lt;一&gt;
  9. 自定义滚动条样式纯(css)
  10. Tasteless challenges hard WP