详解vue2.0监听属性的使用心得及搭配计算属性的使用


Posted in Javascript onJuly 18, 2018

我们在工作中常常需要监听某一个属性值的变化,这个时候我们就需要用到了监听属性watch,在这里我总结watch属性的三种场景使用希望对你有所帮助:

1.基础版监听:

场景如下:输入框输入你的年龄,如果年龄在0-15岁提示信息:你还是个小孩,如果年龄在 15-25岁,提示信息:你已经是个少年,如果年龄在25岁以上,提示信息:你已经长大了。根据需求配合监听属性我们得到下面的代码:

<template>
 <div id="app">
  年?:<input type="number" v-model="age"><br>
  提示信息:<span>{{infoMsg}}</span>
 </div>
</template>

<script>
export default {
 data() {
  return {
   age: "",
   infoMsg:""
  }
 },
 watch:{
  age:function(val,oldval){
   if(val>0 && val<15){
    this.infoMsg="你还是个小孩"
   }else if(val>15 && val<25){
    this.infoMsg="你已经是个少年"
   }else{
    this.infoMsg="你已经长大了"
   }
  }
 }
}
</script>

这里需要特别说明一下的是:坚挺属性方法中的两个参数分别代表的含义:第一个val是当面正在监听的属性的值,oldval是属性改变之前的值,由于这是形参的原因,参数的名字可以自己定义,但是但是参数所代表的含义是不会变化的。

2.进阶版监听:

下面我们改变一下需求:基础规则不变,但是因为后台数据库的更改(画个圈圈咀咒他)我们需要提交一个这样的数据结构

data() {
  return {
   info: {
    age: ""
   },
   infoMsg: ""
  };
 },

由于我们监听的是对象info中的属性age值的变化,所以我们需要使用到的是深度监听,具体代码如下:

<template>
 <div id="app">
  年?:<input type="number" v-model="info.age"><br>
  提示信息:<span>{{infoMsg}}</span>
 </div>
</template>

<script>
export default {
 data() {
  return {
   info: {
    age: ""
   },
   infoMsg: ""
  };
 },
 watch: {
  info: {
   handler: function(val, oldval) {
    var that = this;
    if (val.age > 0 && val.age < 15) {
     that.infoMsg = "你还是个小孩";
    } else if (val.age > 15 && val.age < 25) {
     that.infoMsg = "你已经是个少年";
    } else {
     that.infoMsg = "你已经长大了";
    }
   },
   deep: true
  }
 }
};
</script>

在这里需要注意的有两点:1,这里的function不能使用箭头函数替代,如果使用箭头函数的话,this的指向会是全局。2,你会注意到这里多加入一个属性是deep,它的含义表示是否开启深度监听,如果开启值为true,反之为false。

3.最高级监听:

针对第二个案例不知道你有没有发现一个问题:我们监听的是一个对象里面某个属性的变化,但是如果当这个对象里面有很多个值的时候,虽然也可以使用第二种方法进行监听,但是这将会是对资源的一种极大的浪费,身为一个严谨的程序员(微笑脸),绝对不能允许这样的事情发生,所以我们可以结合computed(计算属性)对上面的代码进行优化:

<template>
 <div id="app">
  年?:<input type="number" v-model="info.age"><br>
  提示信息:<span>{{infoMsg}}</span>
 </div>
</template>
<script>
export default {
 data() {
  return {
   info: {
    age: "",
    name: "",
    hobit: ""
   },
   infoMsg: ""
  };
 },
 computed: {
  ageval: function() {
   return this.info.age;
  }
 },
 watch: {
  ageval: {
   handler: function(val, oldval) {
    var that = this;
    if (val > 0 && val < 15) {
     that.infoMsg = "你还是个小孩";
    } else if (val > 15 && val < 25) {
     that.infoMsg = "你已经是个少年";
    } else {
     that.infoMsg = "你已经长大了";
    }
   },
   deep: true
  }
 }
};
</script>

通过上面的我们看出,这次我们监听的是计算属性ageval,而计算属性返回的则是info对象中age的值,与第二次的代码进行比较我们可以发现两次代码中监听的一个是对象info,一个是info对象中age的值,性能大大增强,这就是我们期待的结果了。

总结

以上所述是小编给大家介绍的vue2.0监听属性的使用心得及搭配计算属性的使用,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!

Javascript 相关文章推荐
判断页面是关闭还是刷新的js代码
Jan 28 Javascript
js怎么终止程序return不行换jfslk
May 30 Javascript
通过js简单实现将一个文本内容转译成加密文本
Oct 22 Javascript
在浏览器中打开或关闭JavaScript的方法
Jun 03 Javascript
IE6兼容透明背景图片及解决方案
Aug 19 Javascript
JS实现表单中checkbox对勾选中增加边框显示效果
Aug 21 Javascript
ionic实现可滑动的tab选项卡切换效果
Apr 15 Javascript
关于不同页面之间实现参数传递的几种方式讨论
Feb 13 Javascript
jquery实现焦点轮播效果
Feb 23 Javascript
微信小程序获取手机号授权用户登录功能
Nov 09 Javascript
详解使用React进行组件库开发
Feb 06 Javascript
Vue 让元素抖动/摆动起来的实现代码
May 31 Javascript
微信小程序将字符串生成二维码图片的操作方法
Jul 17 #Javascript
使用Vue实现图片上传的三种方式
Jul 17 #Javascript
vue的token刷新处理的方法
Jul 17 #Javascript
vue 权限认证token的实现方法
Jul 17 #Javascript
vue 实现axios拦截、页面跳转和token 验证
Jul 17 #Javascript
详解webpack import()动态加载模块踩坑
Jul 17 #Javascript
vue-router中的hash和history两种模式的区别
Jul 17 #Javascript
You might like
浅析Yii2缓存的使用
2016/05/10 PHP
php数据结构之顺序链表与链式线性表示例
2018/01/22 PHP
PHP简单实现图片格式转换(jpg转png,gif转png等)
2019/10/30 PHP
jquery中eq和get的区别与使用方法
2011/04/14 Javascript
js Math 对象的方法
2013/09/01 Javascript
javascript性能优化之DOM交互操作实例分析
2015/12/12 Javascript
浅析JavaScript函数的调用模式
2016/08/10 Javascript
JS实现鼠标滑过显示边框的菜单效果
2016/09/21 Javascript
vue 2.0封装model组件的方法
2017/08/03 Javascript
基于jQuery实现图片推拉门动画效果的两种方法
2017/08/26 jQuery
jQuery 利用ztree实现树形表格的实例代码
2017/09/27 jQuery
vuex 的简单使用
2018/03/22 Javascript
浅谈node中的cluster集群
2018/06/02 Javascript
利用原生的JavaScript实现简单拼图游戏
2018/11/18 Javascript
解决Idea、WebStorm下使用Vue cli脚手架项目无法使用Webpack别名的问题
2019/10/11 Javascript
利用PHP实现递归删除链表元素的方法示例
2020/10/23 Javascript
[54:26]完美世界DOTA2联赛PWL S3 Forest vs Rebirth 第一场 12.10
2020/12/12 DOTA
python实现mysql的单引号字符串过滤方法
2015/11/14 Python
Python创建xml文件示例
2017/03/22 Python
Python中Scrapy爬虫图片处理详解
2017/11/29 Python
python中的字典操作及字典函数
2018/01/03 Python
Python 微信之获取好友昵称并制作wordcloud的实例
2019/02/21 Python
十行代码使用Python写一个USB病毒
2019/06/21 Python
django的csrf实现过程详解
2019/07/26 Python
python求加权平均值的实例(附纯python写法)
2019/08/22 Python
python使用 cx_Oracle 模块进行查询操作示例
2019/11/28 Python
jupyter使用自动补全和切换默认浏览器的方法
2020/11/18 Python
HTML 5 input placeholder 属性如何完美兼任ie
2014/05/12 HTML / CSS
整理HTML5中支持的URL编码与字符编码
2016/02/23 HTML / CSS
台湾三立电视电商平台:电电购
2019/09/09 全球购物
俄罗斯最大的灯具网站:Fandeco
2020/03/14 全球购物
十佳青年个人事迹材料
2014/01/28 职场文书
服务标语大全
2014/06/18 职场文书
2015年财务个人工作总结范文
2015/05/22 职场文书
2015年员工试用期工作总结
2015/05/28 职场文书
攻击最高的10只幽灵系神奇宝贝,坚盾剑怪排第一,第五最为可怕
2022/03/18 日漫