zoukankan      html  css  js  c++  java
  • js 实现watch监听数据变化

    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的变化

  • 相关阅读:
    JDBC存取二进制文件示例
    java多线程向数据库中加载数据
    Lucene建索引代码
    postgresql存储二进制大数据文件
    java项目使用Echarts 做柱状堆叠图,包含点击事件
    子页面获取父页面控件
    JSTL和select标签的组合使用
    log4j配置祥解
    IT项目经理应具备的十大软技能
    Spring和Struct整合的三个方法
  • 原文地址:https://www.cnblogs.com/cengjingdeshuige/p/11663421.html
Copyright © 2011-2022 走看看