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 png 透明解决方案(推荐)
Aug 21 Javascript
JS 各种网页尺寸判断实例方法
Apr 18 Javascript
Javascript实现的常用算法(如冒泡、快速、鸽巢、奇偶等)
Apr 29 Javascript
轻松实现javascript数据双向绑定
Nov 11 Javascript
jquery 动态合并单元格的实现方法
Aug 26 Javascript
ES6学习笔记之Set和Map数据结构详解
Apr 07 Javascript
jQuery选择器中的特殊符号处理方法
Sep 08 jQuery
利用Angular2 + Ionic3开发IOS应用实例教程
Jan 15 Javascript
React Native 图片查看组件的方法
Mar 01 Javascript
Vuex 使用及简单实例(计数器)
Aug 29 Javascript
JS/jQuery实现简单的开关灯效果【案例】
Feb 19 jQuery
如何用vue-cli3脚手架搭建一个基于ts的基础脚手架的方法
Dec 12 Javascript
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
显示youtube视频缩略图和Vimeo视频缩略图代码分享
2014/02/13 PHP
PHP中的Memcache详解
2014/04/05 PHP
php判断GIF图片是否为动画的方法
2020/09/04 PHP
CI分页类首页、尾页不显示的解决方法
2016/03/28 PHP
php识别翻转iphone拍摄的颠倒图片
2018/05/17 PHP
Laravel 简单实现Ajax滚动加载示例
2019/10/22 PHP
PHP pthreads v3使用中的一些坑和注意点分析
2020/02/21 PHP
asp javascript 实现关闭窗口时保存数据的办法
2007/11/24 Javascript
JavaScript高级程序设计 阅读笔记(十八) js跨平台的事件
2012/08/14 Javascript
Javascript基础知识(一)核心基础语法与事件模型
2014/09/29 Javascript
HTML,CSS,JavaScript速查表推荐
2014/12/02 Javascript
基于jquery实现省市联动效果
2015/11/23 Javascript
JS获取鼠标选中的文字
2016/08/10 Javascript
jquery无法为动态生成的元素添加点击事件的解决方法(推荐)
2016/12/26 Javascript
Three.js基础部分学习
2017/01/08 Javascript
vue实现商城购物车功能
2017/11/27 Javascript
vue axios数据请求get、post方法及实例详解
2018/09/11 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
JS工厂模式开发实践案例分析
2019/10/17 Javascript
在vue中通过render函数给子组件设置ref操作
2020/11/17 Vue.js
[47:45]Liquid vs OG 2018国际邀请赛小组赛BO2 第二场 8.16
2018/08/17 DOTA
Python编程之序列操作实例详解
2017/07/22 Python
Python中input与raw_input 之间的比较
2017/08/20 Python
Python实现的井字棋(Tic Tac Toe)游戏示例
2018/01/31 Python
浅谈Tensorflow加载Vgg预训练模型的几个注意事项
2020/05/26 Python
Flask-SocketIO服务端安装及使用代码示例
2020/11/26 Python
CSS3制作hover下划线动画
2017/03/27 HTML / CSS
39美元购买一副眼镜或太阳镜:39DollarGlasses.com
2018/06/17 全球购物
美工的岗位职责
2013/11/14 职场文书
大众服装店创业计划书范文
2014/01/01 职场文书
教师节感恩老师演讲稿
2014/08/28 职场文书
大学生实习证明范文(5篇)
2014/09/18 职场文书
债务纠纷代理词
2015/05/25 职场文书
田径运动会广播稿
2015/08/19 职场文书
高中政治教学反思
2016/02/23 职场文书
聊聊基于pytorch实现Resnet对本地数据集的训练问题
2022/03/25 Python