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 相关文章推荐
鼠标移动到一张图片时变为另一张图片
Dec 05 Javascript
jQuery 连续列表实现代码
Dec 21 Javascript
JavaScript针对网页节点的增删改查用法实例
Feb 02 Javascript
EasyUI,点击开启编辑框,并且编辑框获得焦点的方法
Mar 01 Javascript
Bootstrap每天必学之折叠
Apr 12 Javascript
JSON 的正确用法探讨:Pyhong、MongoDB、JavaScript与Ajax
May 15 Javascript
Bootstrap弹出带合法性检查的登录框实例代码【推荐】
Jun 23 Javascript
JavaScript鼠标特效大全
Sep 13 Javascript
利用Query+bootstrap和js两种方式实现日期选择器
Jan 10 Javascript
vue-cli webpack 开发环境跨域详解
May 18 Javascript
javascript 数据存储的常用函数总结
Jun 01 Javascript
详解JavaScript 浮点数运算的精度问题
Jul 23 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
一个用于MySQL的PHP XML类
2006/10/09 PHP
php $_SERVER windows系统与linux系统下的区别说明
2014/02/14 PHP
PHP中SimpleXML函数用法分析
2014/11/26 PHP
PHP处理大量表单字段的便捷方法
2015/02/07 PHP
利用php-cli和任务计划实现订单同步功能的方法
2017/05/03 PHP
jquery ajax return没有返回值的解决方法
2011/10/20 Javascript
jquery ajax应用中iframe自适应高度问题解决方法
2014/04/12 Javascript
js实现漂浮回顶部按钮实例
2015/05/06 Javascript
jQuery实现获取table表格第一列值的方法
2016/03/01 Javascript
Extjs gridpanel 中的checkbox(复选框)根据某行的条件不能选中的解决方法
2017/02/17 Javascript
基于bootstrap实现多个下拉框同时搜索功能
2017/07/19 Javascript
JavaScript使用Ajax上传文件的示例代码
2017/08/10 Javascript
解决jquery appaend元素中id绑定事件失效的问题
2017/09/12 jQuery
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
原生JS实现循环Nodelist Dom列表的4种方式示例
2018/02/11 Javascript
Vue2.0点击切换类名改变样式的方法
2018/08/22 Javascript
Vue监听滚动实现锚点定位(双向)示例
2019/11/13 Javascript
Nuxt.js的路由跳转操作(页面跳转nuxt-link)
2020/11/06 Javascript
学习 Vue.js 遇到的那些坑
2021/02/02 Vue.js
[02:20]DOTA2亚洲邀请赛 IG战队出场宣传片
2015/02/07 DOTA
Pycharm使用远程linux服务器conda/python环境在本地运行的方法(图解))
2019/12/09 Python
Python enumerate函数遍历数据对象组合过程解析
2019/12/11 Python
Python修改列表值问题解决方案
2020/03/06 Python
jupyter notebook 多行输出实例
2020/04/09 Python
浅谈python多线程和多线程变量共享问题介绍
2020/04/17 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
Python爬虫之Selenium鼠标事件的实现
2020/12/04 Python
使用BeautifulSoup4解析XML的方法小结
2020/12/07 Python
研究生毕业自我鉴定范文
2014/03/27 职场文书
2014年四风问题个人对照自查剖析材料
2014/09/15 职场文书
领导干部个人对照检查材料(群众路线)
2014/09/26 职场文书
2015年主婚人婚礼致辞
2015/07/28 职场文书
劳动合同变更协议书范本
2019/04/18 职场文书
Python Numpy库的超详细教程
2022/04/06 Python
《艾尔登法环》Boss腐烂树灵很有可能是《黑暗之魂3》的一个废案
2022/04/11 其他游戏
ubuntu下常用apt命令介绍
2022/06/05 Servers