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刷新框架子页面的七种方法代码
Nov 20 Javascript
JS链式调用的实现方法
Mar 07 Javascript
javascript结合html5 canvas实现(可调画笔颜色/粗细/橡皮)的涂鸦板
Apr 27 Javascript
给html超链接设置事件不使用href来完成跳
Apr 20 Javascript
用Jquery.load载入页面后样式没了页面混乱的解决方法
Oct 20 Javascript
kindeditor修复会替换script内容的问题
Apr 03 Javascript
浅析javascript中的Event事件
Dec 09 Javascript
创建简单的node服务器实例(分享)
Jun 23 Javascript
Vue.js 通过jQuery ajax获取数据实现更新后重新渲染页面的方法
Aug 09 jQuery
微信小程序动态增加按钮组件
Sep 14 Javascript
vue elementui form表单验证的实现
Nov 11 Javascript
原生JS实现音乐播放器的示例代码
Feb 25 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
织梦模板标记简介
2007/03/11 PHP
php下HTTP Response中的Chunked编码实现方法
2008/11/19 PHP
PHP stream_context_create()作用和用法分析
2011/03/29 PHP
PHP 年龄计算函数(精确到天)
2012/06/07 PHP
PHP可逆加密/解密函数分享
2012/09/25 PHP
更改localhost为其他名字的方法
2014/02/10 PHP
php实现JWT(json web token)鉴权实例详解
2019/11/05 PHP
学习jquery必备 api中英文对照的chm手册 下载
2007/05/03 Javascript
jquery 可排列的表实现代码
2009/11/13 Javascript
ExtJs使用IFrame的实现代码
2010/03/24 Javascript
jquery的冒泡事件的阻止与允许(三种实现方法)
2013/02/01 Javascript
jquery常用函数与方法汇总
2015/09/01 Javascript
深入分析jQuery的ready函数是如何工作的(工作原理)
2015/12/17 Javascript
jQuery实现table中的tr上下移动并保持序号不变的实例代码
2016/07/11 Javascript
基于jQuery实现滚动切换效果
2016/12/02 Javascript
koa上传excel文件并解析的实现方法
2018/08/09 Javascript
vue 属性拦截实现双向绑定的实例代码
2018/10/24 Javascript
Node.js对MongoDB进行增删改查操作的实例代码
2019/04/18 Javascript
vue 实现在同一界面实现组件的动态添加和删除功能
2020/06/16 Javascript
[02:35]DOTA2英雄基础教程 末日使者
2013/12/04 DOTA
python实现随机调用一个浏览器打开网页
2018/04/21 Python
Python实现正弦信号的时域波形和频谱图示例【基于matplotlib】
2018/05/04 Python
python实现判断一个字符串是否是合法IP地址的示例
2018/06/04 Python
Python爬虫实现抓取京东店铺信息及下载图片功能示例
2018/08/07 Python
在Python中输入一个以空格为间隔的数组方法
2018/11/13 Python
Python编程中flask的简介与简单使用
2018/12/28 Python
python 3.6.7实现端口扫描器
2019/09/04 Python
pytorch的梯度计算以及backward方法详解
2020/01/10 Python
利用python对excel中一列的时间数据更改格式操作
2020/07/14 Python
某公司部分笔试题
2013/11/05 面试题
《小白兔和小灰兔》教学反思
2014/02/18 职场文书
奖学金个人总结
2015/03/04 职场文书
2015年部门工作总结范文
2015/03/31 职场文书
Python实现批量自动整理文件
2022/03/16 Python
我的收音机情缘
2022/04/05 无线电
Python内置包对JSON文件数据进行编码和解码
2022/04/12 Python