详解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 时间间隔计算的函数(间隔天数)
Nov 15 Javascript
js的Prototype属性解释及常用方法
May 08 Javascript
JS跨域问题详解
Nov 25 Javascript
confirm确认对话框的实现方法总结
Jun 17 Javascript
相册展示PhotoSwipe.js插件实现
Aug 25 Javascript
webpack入门必知必会
Jan 16 Javascript
详解微信小程序 登录获取unionid
Jun 27 Javascript
Vue v2.5 调整和更新不完全问题
Oct 24 Javascript
vue2.0之多页面的开发的示例
Jan 30 Javascript
JavaScript中import用法总结
Jan 20 Javascript
js校验开始时间和结束时间
May 26 Javascript
Vue.js中Line第三方登录api的实现代码
Jun 29 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
PHP中获取时间的下一周下个月的方法
2014/03/18 PHP
php数字每三位加逗号的功能函数
2015/10/22 PHP
Android App中DrawerLayout抽屉效果的菜单编写实例
2016/03/21 PHP
浅析PHP反序列化中过滤函数使用不当导致的对象注入问题
2020/02/15 PHP
Laravel框架使用技巧之使用url()全局函数返回前一个页面的地址方法详解
2020/04/06 PHP
PHP开发API接口签名生成及验证操作示例
2020/05/27 PHP
基于jQuery的js分页代码
2010/06/10 Javascript
JQuery Study Notes 学习笔记(一)
2010/08/04 Javascript
关于js注册事件的常用方法
2013/04/03 Javascript
node.js中的fs.utimesSync方法使用说明
2014/12/15 Javascript
JavaScript学习笔记之内置对象
2015/01/22 Javascript
jquery实现勾选复选框触发事件给input赋值
2015/02/01 Javascript
React实现点击删除列表中对应项
2017/01/10 Javascript
ionic3 懒加载
2017/08/16 Javascript
IntersectionObserver实现图片懒加载的示例
2017/09/29 Javascript
angular 实现同步验证器跨字段验证的方法
2019/04/11 Javascript
vue webpack build资源相对路径的问题及解决方法
2020/06/04 Javascript
[02:26]2016国际邀请赛8月3日开战 中国军团出征西雅图
2016/08/02 DOTA
python 控制语句
2011/11/03 Python
在GitHub Pages上使用Pelican搭建博客的教程
2015/04/25 Python
Python字符串格式化%s%d%f详解
2018/02/02 Python
Python List cmp()知识点总结
2019/02/18 Python
Python完成哈夫曼树编码过程及原理详解
2019/07/29 Python
Python3操作Excel文件(读写)的简单实例
2019/09/02 Python
对Tensorflow中Device实例的生成和管理详解
2020/02/04 Python
django实现日志按日期分割
2020/05/21 Python
如何在mac版pycharm选择python版本
2020/07/21 Python
python的链表基础知识点
2020/09/13 Python
canvas画图被放大且模糊的解决方法
2020/08/11 HTML / CSS
工作表扬信的范文
2014/01/10 职场文书
幼教求职信
2014/03/12 职场文书
2014年单位植树节活动方案
2014/03/23 职场文书
运动会跳远广播稿5篇
2014/09/17 职场文书
2015年家长学校工作总结
2015/04/22 职场文书
2015年领导班子工作总结
2015/05/23 职场文书
浅谈如何提高PHP代码质量之单元测试
2021/05/28 PHP