js 实现watch监听数据变化的代码


Posted in Javascript onOctober 13, 2019

1.js

/**
 * @desc 属性改变监听,属性被set时出发watch的方法,类似vue的watch
 * @author Jason
 * @study https://www.jianshu.com/p/00502d10ea95
 * @data 2018-04-27
 * @constructor
 * @param {object} opts - 构造参数. @default {data:{},watch:{}};
 * @argument {object} data - 要绑定的属性
 * @argument {object} watch - 要监听的属性的回调
 * watch @callback (newVal,oldVal) - 新值与旧值
 */
 
class watcher{
 constructor(opts){
  this.$data = this.getBaseType(opts.data) === 'Object' ? opts.data : {};
  this.$watch = this.getBaseType(opts.watch) === 'Object' ? opts.watch : {};
  for(let key in opts.data){
   this.setData(key)
  }
 }
 
 getBaseType(target) {
  const typeStr = Object.prototype.toString.apply(target);
  
  return typeStr.slice(8, -1);
 }
 
 setData(_key){
  Object.defineProperty(this,_key,{
   get: function () {
    return this.$data[_key];
   },
   set : function (val) {
    const oldVal = this.$data[_key];
    if(oldVal === val)return val;
    this.$data[_key] = val;
    this.$watch[_key] && typeof this.$watch[_key] === 'function' && (
     this.$watch[_key].call(this,val,oldVal)
    );
    return val;
   },
  });
 }
}
 
// export default watcher;

2.html

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <meta http-equiv="X-UA-Compatible" content="ie=edge">
 <title>wathc</title>
</head>
<body>
 <script src="./watch.js"></script>
 <script>
  let wm = new watcher({
   data:{
    a: 0,
    b: 'hello'
   },
   watch:{
    a(newVal,oldVal){
     console.log(newVal, oldVal); // 111 0
    }
   }
  })
  wm.a = 111
 </script>
</body>
</html> 

 3. 给vm.a 从新赋值 就能看到 newVal 和oldVal的变化

总结

以上所述是小编给大家介绍的js 实现watch监听数据变化的代码,希望对大家有所帮助,如果大家有任何疑问欢迎给我留言,小编会及时回复大家的!

Javascript 相关文章推荐
JavaScript中一个奇葩的IE浏览器判断方法
Apr 16 Javascript
使用mouse事件实现简单的鼠标经过特效
Jan 30 Javascript
jQuery实现鼠标划过添加和删除class的方法
Jun 26 Javascript
获取JavaScript异步函数的返回值
Dec 21 Javascript
jQuery实现简易的输入框字数计数功能示例
Jan 16 Javascript
Node连接mysql数据库方法介绍
Feb 07 Javascript
jQuery获取单选按钮radio选中值与去除所有radio选中状态的方法
May 20 jQuery
详解Angular2中Input和Output用法及示例
May 21 Javascript
使用vue与jquery实时监听用户输入状态的操作代码
Sep 19 jQuery
VUE长按事件需求详解
Oct 18 Javascript
JavaScript常用工具函数汇总(浏览器环境)
Sep 17 Javascript
js实现购物车商品数量加减
Sep 21 Javascript
15 分钟掌握vue-next响应式原理
Oct 13 #Javascript
Vue3.x源码调试的实现方法
Oct 13 #Javascript
使用webpack将ES6转化ES5的实现方法
Oct 13 #Javascript
vue中uni-app 实现小程序登录注册功能
Oct 12 #Javascript
Jquery 动态添加元素并添加点击事件实现过程解析
Oct 12 #jQuery
微信小程序 scroll-view 水平滚动实现过程解析
Oct 12 #Javascript
微信小程序iOS下拉白屏晃动问题解决方案
Oct 12 #Javascript
You might like
基于php伪静态的实现详细介绍
2013/04/28 PHP
Windows2003下php5.4安装配置教程(Apache2.4)
2016/06/30 PHP
PHP输出多个元素的排列或组合的方法
2017/03/14 PHP
php将html转为图片的实现方法
2017/05/19 PHP
php实现的中秋博饼游戏之绘制骰子图案功能示例
2017/11/06 PHP
php微信开发之图片回复功能
2018/06/14 PHP
PHP程序员简单的开展服务治理架构操作详解(二)
2020/05/14 PHP
索趣科技的答案
2007/02/07 Javascript
输入框的字数时时统计—关于 onpropertychange 和 oninput 使用
2011/10/21 Javascript
jquery实现隐藏与显示动画效果/输入框字符动态递减/导航按钮切换
2013/07/01 Javascript
JavaScript实现twitter puddles算法实例
2014/12/06 Javascript
javascript实现表格增删改操作实例详解
2015/05/15 Javascript
JavaScript定时器和优化的取消定时器方法
2015/07/03 Javascript
js创建对象的方法汇总
2016/01/07 Javascript
JSON字符串转换JSONObject和JSONArray的方法
2016/06/03 Javascript
javascript实现循环广告条效果
2017/12/12 Javascript
echarts整合多个类似option的方法实例
2018/07/10 Javascript
什么时候不能在 Node.js 中使用 Lock Files
2019/06/24 Javascript
[45:16]完美世界DOTA2联赛PWL S3 Magma vs Phoenix 第一场 12.12
2020/12/16 DOTA
Python入门篇之文件
2014/10/20 Python
Python读写unicode文件的方法
2015/07/10 Python
Python的Scrapy爬虫框架简单学习笔记
2016/01/20 Python
Pytorch在NLP中的简单应用详解
2020/01/08 Python
Python标准库itertools的使用方法
2020/01/17 Python
pytorch实现保证每次运行使用的随机数都相同
2020/02/20 Python
Python高阶函数与装饰器函数的深入讲解
2020/11/10 Python
Python爬虫自动化获取华图和粉笔网站的错题(推荐)
2021/01/08 Python
HTML5页面直接调用百度地图API获取当前位置直接导航目的地的实现代码
2018/03/02 HTML / CSS
allbeauty美国:英国在线美容店
2019/03/11 全球购物
美国Curacao百货连锁店网站:iCuracao.com
2019/07/20 全球购物
Sql面试题
2013/03/20 面试题
应届行政管理专业个人自我评价
2013/12/28 职场文书
经理管理专业自荐信范文
2013/12/31 职场文书
结婚喜宴祝酒词
2015/08/10 职场文书
护士心得体会范文
2016/01/25 职场文书
初中教务主任竞聘演讲稿(范文)
2019/08/20 职场文书