Vue中使用方法、计算属性或观察者的方法实例详解


Posted in Javascript onOctober 31, 2018

熟悉 Vue 的都知道 方法methods、计算属性computed、观察者watcher 在 Vue 中有着非常重要的作用,有些时候我们实现一个功能的时候可以使用它们中任何一个都是可以的,但是它们之间又存在一些不同之处,每一个都有一些适合自己的场景,我们要想知道合适的场景,肯定先对它们有一个清楚的了解,先看一个小例子。

<div id="app">
 <input v-model="firstName" type="text">
 <input v-model="secondName" type="text">
 <p>{{fullName}}</p>
</div>

methods 方式

var vm = new Vue({
 el: "#app",
 data: {
 firstName: "Mo",
 secondName: "deng",
 fullName: ""
 },
 methods: {
 getFullName () {
  this.fullName = this.firstName + "" + this.secondName;
 }
 },
 mounted () {
 this.getFullName();
 }
});

computed 方式

var vm = new Vue({
 el: "#app",
 data: {
 firstName: "liu",
 secondName: "deng"
 },
 computed: {
 fullName () {
  return this.firstName + "" + this.secondName;
 }
 }
});

watcher 方式

var vm = new Vue({
 el: "#app",
 data: {
 firstName: "liu",
 secondName: "deng",
 fullName: "liudeng"
 },
 watch: {
 firstName: function (value) {
  this.fullName = value+ "" + this.secondName
 },
 secondName: function (value) {
  this.fullName = this.firstName + "" + value
 }
 }
});

我们看到上面三种方法实现一个相同的效果,虽然效果相同,但是我们每个方法之间会有所区别。

methods 方法

在我们使用 Vue 时可能会有很多方法会被放到这里,比如它可能是我们的事件处理方法,一些操作方法的逻辑等等,但是它不能跟踪任何依赖,而且还会在每次组件重新加载时都会执行,这就会导致我们的方法会执行很多次,如果我们的 UI 操作频繁的话,会导致性能的问题,所以在一些开销比较大的计算时,我们应该尝试其他方案进行优化处理。

computed 计算属性

从名字我们其实大概的可以看出,它是一个依赖于其他属性的,当依赖的属性发生变化的时候就会触发我们计算属性的逻辑,而且是基于它们依赖的属性进行缓存的,也就是说只有当依赖的属性发生变化的时候才会从新求值。

相比 methods 的优势在于不必每次从新执行定义的函数,这给我们的性能上有着很大的优势,对我们已经存在的数据属性非常好的处理方式,例如我们案例中 fullName 的计算,优势非常明显。

watcher 观察者

当一些数据属性变化时,我们执行一些逻辑时观察者对我们非常重要,它可以帮助我们监听属性的变化,只要属性发生变化,我们就可以执行对应的一些操作。

如何实现一个 TodoList

查看在线 TodoList

在 methods 中我们放置了一些事件处理方法,我们可以在事件绑定中直接应用,不会依赖于任何的属性。

<button class="todo-remove" type="button" @click="removeTodoItem(item)">x</button>
export default {
 name: "TodoList",
 data() {
 return {
  todoType: "all", //任务类型
  allTodoItems: [],
 };
 },
 methods: {
 //... 省略

 //添加任务
 addItem() {
  this.allTodoItems.push({
  id: this.allTodoItems.length,
  text: this.itemText,
  completed: false
  });
  this.itemText = "";
 },
 //删除任务
 removeTodoItem(item) {
  this.allTodoItems = this.allTodoItems.filter(
  value => value.id != item.id
  );
 }
 }
};

我们可以看到计算属性都是依赖于其他属性的,只有当依赖的属性值发生改变时,我们的计算属性才会发生变化。

例如:passTodoItems 计算属性依赖于 todoType 属性,只要 todoType 属性发生变化,我们的 passTodoItems 也会发生变化,从而筛选出我们需要的数据。

export default {
 name: "TodoList",
 data() {
 return {
  todoType: "all", //任务类型
  allTodoItems: [],
 };
 },
 computed: {
 //展示的任务
 passTodoItems() {
  return this[this.todoType](this.allTodoItems);
 },
 //是否显示底部的选项
 isShowOptions() {
  return this.allTodoItems.length;
 }
 }
}

可以看到我们利用 watcher 进行数据的存储逻辑操作,只要当我们监听的属性 allTodoItems 发生变化时,我们就把数据进行保存。

export default {
 name: "TodoList",
 data() {
 return {
  todoType: "all", //任务类型
  allTodoItems: [],
 };
 },
 watch: {
 allTodoItems: {
  handler() {
  localStorage.setItem("todoItems", JSON.stringify(this.allTodoItems));
  },
  deep: true //深度监听对象属性的变化,如果没有检测不到对象属性的变化
 }
 }
}

总结

通过一个简单的 TodoList 案例展示了 methods、computed、watcher 三者的用法,当然我们的实战项目中不仅仅是这么简单。

我们再使用 methods、computed、watcher 时,应该选择它们合适的使用场景,虽然它们可以实现相同的结果。

methods 一般定义一些事件处理方法,操作方法,因为会频繁的触发,所以会引起性能问题,一般不会用在操作频繁的地方。

computed 会依赖于其他已经存在的属性,而且会进行缓存,只有在依赖的属性发生变化时,计算属性才会发生改变,开销大的地方使用较多。

watcher 它提供了一个更通用的方法来监听我们的属性,当我们的属性变化是执行一些逻辑的操作。

以上所述是小编给大家介绍的Vue中使用方法、计算属性或观察者的方法实例详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
jQuery获取CSS样式中的颜色值的问题,不同浏览器格式不同的解决办法
May 13 Javascript
js切换光标示例代码
Oct 10 Javascript
jQuery实现的一个tab切换效果内部还嵌有切换
Aug 10 Javascript
jQuery+CSS3实现树叶飘落特效
Feb 01 Javascript
利用jQuery实现CheckBox全选/全不选/反选的简单代码
May 31 Javascript
Boostrap栅格系统与自己额外定义的媒体查询的冲突问题
Feb 19 Javascript
JS中Attr的用法详解
Oct 09 Javascript
详解如何搭建mpvue框架搭配vant组件库的小程序项目
May 16 Javascript
javascript设计模式 ? 工厂模式原理与应用实例分析
Apr 09 Javascript
Js生成随机数/随机字符串的方法小结【5种方法】
May 27 Javascript
Jquery ajax书写方法代码实例解析
Jun 12 jQuery
ajax jquery实现页面某一个div的刷新效果
Mar 04 jQuery
Vue项目History模式404问题解决方法
Oct 31 #Javascript
Vue.js中对css的操作(修改)具体方式详解
Oct 30 #Javascript
vue组件中的样式属性scoped实例详解
Oct 30 #Javascript
node上的redis调用优化示例详解
Oct 30 #Javascript
elementUI 设置input的只读或禁用的方法
Oct 30 #Javascript
Vue.js 父子组件通信的十种方式
Oct 30 #Javascript
vue通过style或者class改变样式的实例代码
Oct 30 #Javascript
You might like
destoon整合ucenter后注册页面不跳转的解决方法
2014/06/21 PHP
PHP中对各种加密算法、Hash算法的速度测试对比代码
2014/07/08 PHP
PHP面向对象精要总结
2014/11/07 PHP
php二维数组合并及去重复的方法
2015/03/04 PHP
PHP解压ZIP文件到指定文件夹的方法
2016/11/17 PHP
javascript 写类方式之九
2009/07/05 Javascript
一个JavaScript的求爱小特效
2014/05/09 Javascript
JavaScript判断表单中多选框checkbox选中个数的方法
2015/08/17 Javascript
JavaScript观察者模式(经典)
2015/12/09 Javascript
javascript时间排序算法实现活动秒杀倒计时效果
2021/01/28 Javascript
JavaScript html5 canvas绘制时钟效果(二)
2016/03/27 Javascript
使用JavaScript实现ajax的实例代码
2016/05/11 Javascript
从零开始学习Node.js系列教程之SQLite3和MongoDB用法分析
2017/04/13 Javascript
Js通过AES加密后PHP用Openssl解密的方法
2019/07/12 Javascript
vue quill editor 使用富文本添加上传音频功能
2020/01/14 Javascript
如何在JavaScript中创建具有多个空格的字符串?
2020/02/23 Javascript
vue tab切换,解决echartst图表宽度只有100px的问题
2020/07/19 Javascript
[01:51]2014DOTA2国际邀请赛 这个赛场没有失败者VGTi5再见
2014/07/23 DOTA
Python操作串口的方法
2015/06/17 Python
python 遍历字符串(含汉字)实例详解
2017/04/04 Python
Python2.7 实现引入自己写的类方法
2018/04/29 Python
python numpy数组的索引和切片的操作方法
2018/10/20 Python
Python字典的基本用法实例分析【创建、增加、获取、修改、删除】
2019/03/05 Python
使用Python检测文章抄袭及去重算法原理解析
2019/06/14 Python
python 实现创建文件夹和创建日志文件的方法
2019/07/07 Python
Python selenium抓取虎牙短视频代码实例
2020/03/02 Python
利用python清除移动硬盘中的临时文件
2020/10/28 Python
Python字符串的15个基本操作(小结)
2021/02/03 Python
html5-canvas中使用clip抠出一个区域的示例代码
2018/05/25 HTML / CSS
伯利陶器:Burleigh Pottery
2018/01/03 全球购物
在Java开发中如何选择使用哪种集合类
2016/08/09 面试题
护理人员的自我评价分享
2014/03/15 职场文书
党员检讨书
2014/10/13 职场文书
2015年宣传工作总结
2015/04/08 职场文书
导游词之重庆渣滓洞
2020/01/08 职场文书
Django与数据库交互的实现
2021/06/03 Python