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 TextArea动态显示剩余字符
Oct 22 Javascript
JQuery表格内容过滤的实现方法
Jul 05 Javascript
如何在JavaScript中实现私有属性的写类方式(一)
Dec 04 Javascript
Jquery中Event对象属性小结
Feb 27 Javascript
JavaScript中rem布局在react中的应用
Dec 09 Javascript
JavaScript组件开发完整示例
Dec 15 Javascript
canvas实现绘制吃豆鱼效果
Jan 12 Javascript
微信小程序返回多级页面的实现方法
Oct 27 Javascript
javascriptvoid(0)含义以及与&quot;#&quot;的区别讲解
Jan 19 Javascript
开发中常用的25个JavaScript单行代码(小结)
Jun 28 Javascript
vue路由教程之静态路由
Sep 03 Javascript
手写Vue2.0 数据劫持的示例
Mar 04 Vue.js
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
phpMyAdmin 链接表的附加功能尚未激活的问题
2010/08/01 PHP
强制PHP命令行脚本单进程运行的方法
2014/04/15 PHP
Yii查询生成器(Query Builder)用法实例教程
2014/09/04 PHP
php curl模拟post请求和提交多维数组的示例代码
2015/11/19 PHP
php校验公钥是否可用的实例方法
2019/09/17 PHP
Javascript 获取字符串字节数的多种方法
2009/06/02 Javascript
Jquery命名冲突解决的五种方案分享
2012/03/16 Javascript
js获得指定控件输入光标的坐标兼容IE,Chrome,火狐等多种主流浏览器
2013/05/21 Javascript
JavaScript获取并更改input标签name属性的方法
2015/07/02 Javascript
jQuery表单验证功能实例
2015/08/28 Javascript
JS onkeypress兼容性写法详解
2016/04/27 Javascript
Bootstrap下拉菜单Dropdowns的实现代码
2017/03/17 Javascript
vue环境搭建简单教程
2017/11/07 Javascript
jQuery实现列表的增加和删除功能
2018/06/14 jQuery
详解Vue2.5+迁移至Typescript指南
2019/08/01 Javascript
Python版微信红包分配算法
2015/05/04 Python
python去除所有html标签的方法
2015/05/05 Python
python 获取当天每个准点时间戳的实例
2018/05/22 Python
Django读取Mysql数据并显示在前端的实例
2018/05/27 Python
Pandas:DataFrame对象的基础操作方法
2018/06/07 Python
对TensorFlow的assign赋值用法详解
2018/07/30 Python
实例讲解python中的序列化知识点
2018/10/08 Python
python实现键盘控制鼠标移动
2020/11/27 Python
Python实战购物车项目的实现参考
2019/02/20 Python
Python程序打包工具py2exe和PyInstaller详解
2019/06/28 Python
python爬虫 爬取超清壁纸代码实例
2019/08/16 Python
python3中替换python2中cmp函数的实现
2019/08/20 Python
在django中自定义字段Field详解
2019/12/03 Python
Cython编译python为so 代码加密示例
2019/12/23 Python
社区服务活动小结
2014/07/08 职场文书
独生子女证明范本
2015/06/19 职场文书
朋友圈早安励志语录!
2019/07/08 职场文书
解析:创业计划书和商业计划书二者之间到底有什么区别
2019/08/14 职场文书
详解MySQL的半同步
2021/04/22 MySQL
详解Python生成器和基于生成器的协程
2021/06/03 Python
MySQL 外键约束和表关系相关总结
2021/06/20 MySQL