首页 > 其他分享 >js 实现watch监听数据变化的代码

js 实现watch监听数据变化的代码

时间:2022-08-31 15:13:20浏览次数:52  
标签:val watch js oldVal key data 监听 opts

/**
 * @desc 属性改变监听,属性被set时出发watch的方法,类似vue的watch
 * @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 () {
        console.log(this.$data)
        return this.$data[_key];
      },
      set: function (val) {
        console.log(this.$data)
        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;

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> 

标签:val,watch,js,oldVal,key,data,监听,opts
From: https://www.cnblogs.com/echohye/p/16643157.html

相关文章

  • js 多条件 多数据筛选
    场景:前端多条件过滤   数据格式:[{color:"",companyName:"济南宏益环境科技有限公司",orgid:"370114",remark:"111",tag:"人工标记"},……]方法定义:expo......
  • 【debug技巧】jstat:虚拟机统计信息监视器
    我们在日常开发时,难免会遇到一些没有内存泄漏等问题。有时,我们无法下载arthas等开源的诊断工具。这时候,我们就可以借助JDK自带的一些诊断工具。首先我们可以使用jstat......
  • OPNsense 防火墙系列二:SSL 证书和监听端口更改
    SSL证书默认OPNsense在初始化时,就默认监听80和443端口,强制SSL跳转,规定使用自签名的证书,有效期一年.我们只需要添加第三方证书并设置使用即可。申请证书需要拥......
  • Vue -- 监听隐藏显示窗口后重新请求数据
    为什么会用到监听隐藏显示窗口的事件呢?主要是因为页面中有计时器,窗口隐藏页面隐藏后,计时器暂停,这里使用了重新获取数据,重新启动倒计时的功能解决,所以需要监听事件。metho......
  • npm安装vue,在vue/dist目录下没有产生vue.js文件 npm init -y npm install vue@
    npm安装vue,在vue/dist目录下没有产生vue.js文件遇到问题:在进行npminstall时,vue/dist目录下没有生成vue.js的情况。解决办法:只在vue后面加上@2指定版本即可。npmi......
  • 编程小白也能快速掌握的ArkUI JS组件开发
    Playground自上线以来,得到了广大开发者的一致好评。特别是它的ArkUIJS组件在线预览功能,不但可以从中学习基础组件的使用,还可以在线体验一键预览的编译效果。通过Playgr......
  • JS311,第 2 天
    JS311,第2天你如何组织你的代码?您在网上找到了哪些建议?我通过JavaScript中的简化函数来组织我的代码。我还尝试组织我的CSS以尽可能地匹配我的HTML。网络建议按......
  • js-cookie.js的使用
    js-cookie.js的使用3种引入js-cookie.js的方法:一.直接引用cdn:<scriptsrc="https://cdn.jsdelivr.net/npm/js-cookie@2/src/js.cookie.min.js"></script>二.本地下......
  • js两种注册事件的区别
    传统on注册(L0)同一个对象,后面注册的事件会覆盖前面注册(同一个事件)直接使用null覆盖偶就可以实现事件的解绑都是冒泡阶段执行的事件监听注册(L2)语法:addEventListene......
  • JS凯撒密码
    JS凯撒密码加密functionjiami(str,num){varnewStr="";for(leti=0;i<str.length;i++){if(str.charCodeAt(i)>=65&&str.char......