美文网首页
小程序watch监听数据变化

小程序watch监听数据变化

作者: Mr_Liu攻城狮 | 来源:发表于2020-12-16 14:00 被阅读0次

    1:app.js 文件

    /** 


    * 设置监听器

    */

    setWatcher(page) {

    let data = page.data;

    let watch = page.watch;

    Object.keys(watch).forEach(v => {

    let key = v.split('.'); // 将watch中的属性以'.'切分成数组

    let nowData = data; // 将data赋值给nowData

    for (let i = 0; i < key.length - 1; i++) { // 遍历key数组的元素,除了最后一个!

    nowData = nowData[key[i]]; // 将nowData指向它的key属性对象

    }

    let lastKey = key[key.length - 1];

    // 假设key==='my.name',此时nowData===data['my']===data.my,lastKey==='name'

    let watchFun = watch[v].handler || watch[v]; // 兼容带handler和不带handler的两种写法

    let deep = watch[v].deep; // 若未设置deep,则为undefine

    this.observe(nowData, lastKey, watchFun, deep, page); // 监听nowData对象的lastKey

    })

    },

    /**

    * 监听属性 并执行监听函数

    */

    observe(obj, key, watchFun, deep, page) {

    var val = obj[key];

    // 判断deep是true 且 val不能为空 且 typeof val==='object'(数组内数值变化也需要深度监听)

    if (deep && val != null && typeof val === 'object') {

    Object.keys(val).forEach(childKey=>{ // 遍历val对象下的每一个key

    this.observe(val,childKey,watchFun,deep,page); // 递归调用监听函数

    })

    }

    var that = this;

    Object.defineProperty(obj, key, {

    configurable: true,

    enumerable: true,

    set: function(value) {

    // 用page对象调用,改变函数内this指向,以便this.data访问data内的属性值

    watchFun.call(page,value,val); // value是新值,val是旧值

    val = value;

    if(deep){ // 若是深度监听,重新监听该对象,以便监听其属性。

    that.observe(obj, key, watchFun, deep, page);

    }

    },

    get: function() {

    return val;

    }

    })

    },

    2:index.js

    onLoad: function (options) {

        app.setWatcher(this); // 设置监听器

    },

    watch:{

    id:function(val, old){

    // console.log('old, val==============');

    // console.log(old, val);

    if(val && old){

    if(val != old){

    }

    }

    }

    },

    相关文章

      网友评论

          本文标题:小程序watch监听数据变化

          本文链接:https://www.haomeiwen.com/subject/meingktx.html