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 相关文章推荐
番茄的表单验证类代码修改版
Jul 18 Javascript
JavaScript 密码强度判断代码
Sep 05 Javascript
JavaScript排序算法之希尔排序的2个实例
Apr 04 Javascript
jquery实现移动端点击图片查看大图特效
Sep 11 Javascript
Ajax的概述与实现过程
Nov 18 Javascript
js实现功能比较全面的全选和多选
Mar 02 Javascript
js+html制作简单日历的方法
Jun 27 Javascript
React实现全局组件的Toast轻提示效果
Sep 21 Javascript
Vue框架下引入ActiveX控件的问题解决
Mar 25 Javascript
关于vue组件事件属性穿透详解
Oct 28 Javascript
Node.js API详解之 querystring用法实例分析
Apr 29 Javascript
详解在IDEA中将Echarts引入web两种方式(使用js文件和maven的依赖导入)
Jul 11 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中判断一个请求是ajax请求还是普通请求的方法
2011/06/28 PHP
php Session存储到Redis的方法
2013/11/04 PHP
thinkPHP实现MemCache分布式缓存功能
2016/03/23 PHP
PHP实现的线索二叉树及二叉树遍历方法详解
2016/04/25 PHP
PHP实现的mysql主从数据库状态检测功能示例
2017/07/20 PHP
jquery ajax 同步异步的执行示例代码
2010/06/23 Javascript
jQuery获取Select选择的Text和Value(详细汇总)
2013/01/25 Javascript
jQuery ajax dataType值为text json探索分享
2013/09/23 Javascript
javascript拖拽上传类库DropzoneJS使用方法
2013/12/05 Javascript
iframe里的页面禁止右键事件的方法
2014/06/10 Javascript
使用js画图之圆、弧、扇形
2015/01/12 Javascript
Javascript中的arguments与重载介绍
2015/03/15 Javascript
一个php+js实时显示时间问题
2015/10/12 Javascript
jquery基础知识第一讲之认识jquery
2016/03/17 Javascript
详解JS几种变量交换方式以及性能分析对比
2016/11/25 Javascript
Javascript实现登录记住用户名和密码功能
2017/03/22 Javascript
JS+canvas动态绘制饼图的方法示例
2017/09/12 Javascript
浅谈React Event实现原理
2018/09/20 Javascript
深入理解JavaScript 中的执行上下文和执行栈
2018/10/23 Javascript
electron-vue利用webpack打包实现多页面的入口文件问题
2019/05/12 Javascript
JavaScript实现Tab选项卡切换
2020/02/13 Javascript
jQuery 选择方法及$(this)用法实例分析
2020/05/19 jQuery
利用 Chrome Dev Tools 进行页面性能分析的步骤说明(前端性能优化)
2021/02/24 Javascript
使用apidocJs快速生成在线文档的实例讲解
2018/02/07 Python
Python面向对象程序设计之静态方法、类方法、属性方法原理与用法分析
2020/03/23 Python
沙龙级头发造型工具:FOXYBAE
2018/07/01 全球购物
德国Discount-Apotheke中文官网:DC德式康线上药房
2020/02/18 全球购物
自荐信的五个重要部分
2013/10/29 职场文书
英文简历自荐信范文
2013/12/11 职场文书
《邮票齿孔的故事》教学反思
2014/02/22 职场文书
2014学年自我鉴定
2014/02/23 职场文书
高中军训感言800字
2014/03/05 职场文书
成绩单家长意见
2015/06/03 职场文书
帝企鹅日记观后感
2015/06/10 职场文书
应届毕业生的自我评价
2019/06/21 职场文书
对Golang中的FORM相关字段理解
2021/05/02 Golang