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 相关文章推荐
33个优秀的jQuery 教程分享(幻灯片、动画菜单)
Jul 08 Javascript
8款非常棒的响应式jQuery 幻灯片插件推荐
Feb 02 Javascript
jQuery setTimeout()函数使用方法
Apr 07 Javascript
JavaScript类型系统之Object详解
Jan 07 Javascript
jQuery css() 方法动态修改CSS属性
Sep 25 Javascript
vue父子组件的数据传递示例
Mar 07 Javascript
bootstrap-table实现服务器分页的示例 (spring 后台)
Sep 01 Javascript
react.js 父子组件数据绑定实时通讯的示例代码
Sep 25 Javascript
Vue侧滑菜单组件——DrawerLayout
Dec 18 Javascript
基于JavaScript实现抽奖系统
Jan 16 Javascript
Javascript读写cookie的实例源码
Mar 16 Javascript
Javascript实现简易天数计算器
May 18 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
探讨fckeditor在Php中的配置详解
2013/06/08 PHP
fckeditor上传文件按日期存放及重命名方法
2015/05/22 PHP
mouse_on_title.js
2006/08/25 Javascript
getElementById在任意一款浏览器中都可以用吗的疑问回复
2007/05/13 Javascript
非阻塞动态加载javascript广告实现代码
2010/11/17 Javascript
JavaScript之appendChild、insertBefore和insertAfter使用说明
2010/12/30 Javascript
ejs v9 javascript模板系统
2012/03/21 Javascript
JS判断页面是否出现滚动条的方法
2015/07/17 Javascript
jQuery网页选项卡插件rTabs用法实例分析
2015/08/26 Javascript
js实现页面a向页面b传参的方法
2016/05/29 Javascript
JS中判断null的方法分析
2016/11/21 Javascript
jQuery Json数据格式排版高亮插件json-viewer.js使用方法详解
2017/06/12 jQuery
Nodejs之TCP服务端与客户端聊天程序详解
2017/07/07 NodeJs
javascript将url解析为json格式的两种方法
2017/08/18 Javascript
JavaScript中运算符规则和隐式类型转换示例详解
2017/09/06 Javascript
使用命令行工具npm新创建一个vue项目的方法
2017/12/27 Javascript
vue展示dicom文件医疗系统的实现代码
2018/08/27 Javascript
使用 webpack 插件自动生成 vue 路由文件的方法
2019/08/20 Javascript
JS继承实现方法及优缺点详解
2020/09/02 Javascript
原生JavaScript实现贪吃蛇游戏
2020/11/04 Javascript
解决vant中 tab栏遇到的坑 van-tabs
2020/11/04 Javascript
python中的装饰器详解
2015/04/13 Python
Python中如何获取类属性的列表
2016/12/26 Python
5款非常棒的Python工具
2018/01/05 Python
对python 判断数字是否小于0的方法详解
2019/01/26 Python
Python如何实现FTP功能
2020/05/28 Python
Python实现网络聊天室的示例代码(支持多人聊天与私聊)
2021/01/27 Python
历史专业毕业生的自我鉴定
2013/11/15 职场文书
优秀教师事迹简介
2014/02/02 职场文书
干部现实表现材料
2014/02/13 职场文书
文明风采获奖感言
2014/02/18 职场文书
财务检查整改报告
2014/11/06 职场文书
迟到检讨书
2015/01/26 职场文书
客户答谢会致辞
2015/07/30 职场文书
《青山不老》教学反思
2016/02/22 职场文书
浅谈Redis的几个过期策略
2021/05/27 Redis