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 相关文章推荐
js打造数组转json函数
Jan 14 Javascript
JS+CSS实现的经典圆角下拉菜单效果代码
Oct 21 Javascript
实例讲解jQuery中对事件的命名空间的运用
May 24 Javascript
AngularJS轻松实现双击排序的功能
Aug 30 Javascript
基于touch.js手势库+zepto.js插件开发图片查看器(滑动、缩放、双击缩放)
Nov 17 Javascript
JS 实现计算器详解及实例代码(一)
Jan 08 Javascript
解析jquery easyui tree异步加载子节点问题
Mar 08 Javascript
vue中如何引入jQuery和Bootstrap
Apr 10 jQuery
Vue父子模版传值及组件传值的三种方法
Nov 27 Javascript
vue移动端html5页面根据屏幕适配的四种解决方法
Oct 19 Javascript
JQuery常见节点操作实例分析
May 15 jQuery
最简单的vue消息提示全局组件的方法
Jun 16 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的FTP学习(二)
2006/10/09 PHP
ThinkPHP3.1新特性之动态设置自动完成及自动验证示例代码
2014/06/23 PHP
weiphp微信公众平台授权设置
2016/01/04 PHP
PHP addAttribute()函数讲解
2019/02/03 PHP
js 对象是否存在判断
2009/07/15 Javascript
javascript 延迟加载技术(lazyload)简单实现
2011/01/17 Javascript
JavaScript中判断函数是new还是()调用的区别说明
2011/04/07 Javascript
使用jquery mobile做幻灯播放效果实现步骤
2013/01/04 Javascript
关闭浏览器窗口弹出提示框并且可以控制其失效
2014/04/15 Javascript
javascript面向对象之定义成员方法实例分析
2015/01/13 Javascript
NodeJS中利用Promise来封装异步函数
2015/02/25 NodeJs
jQuery选择器源码解读(三):tokenize方法
2015/03/31 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
JS获取url参数,JS发送json格式的POST请求方法
2018/03/29 Javascript
Vue.js的动态组件模板的实现
2018/11/26 Javascript
在vue中根据光标的显示与消失实现下拉列表
2019/09/29 Javascript
Python tkinter模块弹出窗口及传值回到主窗口操作详解
2017/07/28 Python
启动targetcli时遇到错误解决办法
2017/10/26 Python
python实现在IDLE中输入多行的方法
2018/04/19 Python
python利用pandas将excel文件转换为txt文件的方法
2018/10/23 Python
python消除序列的重复值并保持顺序不变的实例
2018/11/08 Python
解决python中画图时x,y轴名称出现中文乱码的问题
2019/01/29 Python
Python函数装饰器原理与用法详解
2019/08/16 Python
python3使用GUI统计代码量
2019/09/18 Python
在keras 中获取张量 tensor 的维度大小实例
2020/06/10 Python
Python 按比例获取样本数据或执行任务的实现代码
2020/12/03 Python
英国女士和男士时尚服装网上购物:Top Labels Online
2018/03/25 全球购物
财务管理职业生涯规划范文
2013/12/27 职场文书
企业仓管员岗位职责
2014/06/15 职场文书
2015年计算机教师工作总结
2015/07/22 职场文书
感恩教师节主题班会
2015/08/12 职场文书
创业计划书之养殖业
2019/10/11 职场文书
Python基础之赋值,浅拷贝,深拷贝的区别
2021/04/30 Python
Django给表单添加honeypot验证增加安全性
2021/05/06 Python
Golang 语言控制并发 Goroutine的方法
2021/06/30 Golang
恶魔之树最顶端的三颗果实 震震果实上榜,第一可以制造岩浆
2022/03/18 日漫