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 相关文章推荐
关于jQuery object and DOM element
Apr 15 Javascript
JavaScript实现算术平方根算法-代码超简单
Sep 11 Javascript
JavaScript学习笔记(三):JavaScript也有入口Main函数
Sep 12 Javascript
ExtJS 4.2 Grid组件单元格合并的方法
Oct 12 Javascript
Bootstrap CSS布局之列表
Dec 15 Javascript
angularJs使用$watch和$filter过滤器制作搜索筛选实例
Jun 01 Javascript
Vuex 使用 v-model 配合 state的方法
Nov 13 Javascript
Vue插件从封装到发布的完整步骤记录
Feb 28 Javascript
从0到1搭建Element的后台框架的方法步骤
Apr 10 Javascript
基于axios 的responseType类型的设置方法
Oct 29 Javascript
JavaScript多种滤镜算法实现代码实例
Dec 10 Javascript
node.js中 redis 的安装和基本操作示例
Feb 10 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
PHP5.0对象模型探索之抽象方法和抽象类
2006/09/05 PHP
php中用加号与用array_merge合并数组的区别深入分析
2013/06/03 PHP
基于PHP代码实现中奖概率算法可用于刮刮卡、大转盘等抽奖算法
2015/12/20 PHP
Symfony模板的快捷变量用法实例
2016/03/17 PHP
PHP实现对文件锁进行加锁、解锁操作的方法
2017/07/04 PHP
实例分析基于PHP微信网页获取用户信息
2017/11/24 PHP
js实现兼容IE、Firefox的图片缩放代码
2015/12/08 Javascript
JavaScript 定时器 SetTimeout之定时刷新窗口和关闭窗口(代码超简单)
2016/02/26 Javascript
jquery 实时监听输入框值变化的完美方法(必看)
2017/01/26 Javascript
SpringMVC+bootstrap table实例详解
2017/06/02 Javascript
vue-router单页面路由
2017/06/17 Javascript
VUEJS 2.0 子组件访问/调用父组件的实例
2018/02/10 Javascript
bootstrap实现点击删除按钮弹出确认框的实例代码
2018/08/16 Javascript
浅谈react性能优化的方法
2018/09/05 Javascript
jQuery轻量级表单模型验证插件
2018/10/15 jQuery
vue实现的仿淘宝购物车功能详解
2019/01/27 Javascript
no-vnc和node.js实现web远程桌面的完整步骤
2019/08/11 Javascript
Vue-CLI与Vuex使用方法实例分析
2020/01/06 Javascript
Vue常用的全选/反选的示例代码
2020/02/19 Javascript
python互斥锁、加锁、同步机制、异步通信知识总结
2018/02/11 Python
对python中的xlsxwriter库简单分析
2018/05/04 Python
python 字典修改键(key)的几种方法
2018/08/10 Python
Flask使用Pyecharts在单个页面展示多个图表的方法
2019/08/05 Python
python中Lambda表达式详解
2019/11/20 Python
python Selenium 库的使用技巧
2020/10/16 Python
css3实现3D色子翻转特效
2014/12/23 HTML / CSS
html5使用canvas绘制文字特效
2014/12/15 HTML / CSS
激光脱毛、蓝光和护肤:Tria Beauty
2019/03/28 全球购物
统计每一学生的平均成绩
2014/06/06 面试题
Laravel的加密解密与哈希实例讲解
2021/03/24 PHP
怎样写留学自荐信
2013/11/11 职场文书
家具厂厂长岗位职责
2014/01/01 职场文书
迎八一活动主题
2014/01/31 职场文书
幼儿园标语大全
2014/06/19 职场文书
《分数乘法》教学反思
2016/02/24 职场文书
使用pycharm运行flask应用程序的详细教程
2021/06/07 Python