详解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 相关文章推荐
jQuery设置div一直在页面顶部显示的方法
Oct 24 Javascript
js实现日期级联效果
Jan 23 Javascript
javascript中的this详解
Dec 08 Javascript
jQuery动态修改超链接地址的方法
Feb 13 Javascript
微信开发 微信授权详解
Oct 21 Javascript
纯js仿淘宝京东商品放大镜功能
Mar 02 Javascript
ionic grid(栅格)九宫格制作详解
Jun 30 Javascript
vue.js实现的全选与全不选功能示例【基于elementui】
Dec 03 Javascript
微信小程序实现多个按钮的颜色状态转换
Feb 15 Javascript
详解iframe跨域的几种常用方法(小结)
Apr 29 Javascript
JavaScript字符串处理常见操作方法小结
Nov 15 Javascript
Vue+Element ui 根据后台返回数据设置动态表头操作
Sep 21 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.ini 中文版
2006/10/28 PHP
修改Zend引擎实现PHP源码加密的原理及实践
2008/04/14 PHP
PHP实现获取文件后缀名的几种常用方法
2015/08/08 PHP
Laravel学习教程之View模块详解
2017/09/18 PHP
Yii2.0框架实现带分页的多条件搜索功能示例
2019/02/20 PHP
laravel利用中间件做防非法登录和权限控制示例
2019/10/21 PHP
超级简单的图片防盗(HTML),好用
2007/04/08 Javascript
Prototype 学习 工具函数学习($w,$F方法)
2009/07/12 Javascript
parseInt parseFloat js字符串转换数字
2010/08/01 Javascript
js中的push和join方法使用介绍
2013/10/08 Javascript
node.js中的socket.io入门实例
2014/04/26 Javascript
在Google 地图上实现做的标记相连接
2015/01/05 Javascript
JS实现在网页中弹出一个输入框的方法
2015/03/03 Javascript
轻松实现javascript图片轮播特效
2016/01/13 Javascript
javascript深拷贝(deepClone)详解
2016/08/24 Javascript
jQuery Ajax实现跨域请求
2017/01/21 Javascript
node文字生成图片的示例代码
2017/10/26 Javascript
详解如何快速配置webpack多入口脚手架
2018/12/28 Javascript
详解jQuery-each()方法
2019/03/13 jQuery
Vue使用watch监听一个对象中的属性的实现方法
2019/05/10 Javascript
[46:42]DOTA2-DPC中国联赛正赛 Aster vs Magma BO3 第二场 3月5日
2021/03/11 DOTA
使用Python编写一个在Linux下实现截图分享的脚本的教程
2015/04/24 Python
python snownlp情感分析简易demo(分享)
2017/06/04 Python
python仿evething的文件搜索器实例代码
2019/05/13 Python
使用Python实现 学生学籍管理系统
2019/11/26 Python
pytorch实现从本地加载 .pth 格式模型
2020/02/14 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
美国香薰蜡烛品牌:PADDYWAX
2018/10/06 全球购物
美国班级戒指、帽子和礼服、毕业产品、年鉴:Balfour
2018/11/01 全球购物
党校自我鉴定范文
2013/10/02 职场文书
四年的个人工作自我评价
2013/12/10 职场文书
2015年毕业生自我鉴定模板
2014/09/19 职场文书
2014年服务行业工作总结
2014/11/18 职场文书
通知函格式范文
2015/04/27 职场文书
在 Python 中利用 Pool 进行多线程
2022/04/24 Python
JavaScript实现简单的音乐播放器
2022/08/14 Javascript