美文网首页
js 监听数组操作的两种方式;扩展对数组递归执行操作

js 监听数组操作的两种方式;扩展对数组递归执行操作

作者: 初心OH | 来源:发表于2019-03-08 18:21 被阅读0次

    废话不多,直接上代码:

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>es6 监听数组</title>
        </head>
        <body>
            <script>
    
                let oldobj = [];
    
                //使用代理监听数组,弊端(当向array中push值的时候,console会执行两次)
                let array = new Proxy(oldobj, {
                    get: function (target, key, receiver) {
                        return target[key];
                    },
                    set: function (target, key, value, receiver) {
                        target[key] = value;
                        console.log(`${target}, ${receiver},修改了key:${key},新值:${value}`)
                        return true;
                    }
                })
    
                /*
                * 華麗的分割綫
                * */
    
                //重写Array,监听数组(当向list中push值的时候,console只执行一次)
                class NewArray extends Array {
                    constructor(...args) {
                        console.log(...args)
                        super(...args)
                    }
    
                    push(...args) {
                        super.push(...args);
                        let _this = this;
                        //console.log(`监听数组, ${_this}`)
                        arrayCallback();
                        return this.length;
                    }
                }
    
    
                //监控数组如果有值进来,则执行递归方法。
                let list = new NewArray(), beWorking = false;
                list.push(1);
                list.push(2);
                list.push(3);
                list.push(4);
                list.push(5);
    
                function arrayCallback() {
                    console.log(`數組產生了變化. ${list.length}`);
                    if(!beWorking){//如果递归没有在执行,则执行递归方法;如果递归方法已经开始执行,则该方法不执行。
                        recursionRemove(list);
                    }
                }
    
                function recursionRemove(array) {
                    setTimeout(function () {
                        //do something
                        console.log(`删除了元素${array[0]}`);
    
                        array.shift();//删除第一个元素
                        if(array.length == 0){
                            beWorking = false;
                        }else{
                            recursionRemove(array);
                        }
                    }, 2000);
                }
    
            </script>
        </body>
    </html>
    

    楼主亲测,使用代理模式,set可以监听到两次。第一次是值的变化,第二次是数组长度的变化。
    而使用重写Array的方式,当想数组中push值时,则只会执行一次。

    废话多一句,可能人老了,最近接触了javascript es6 感觉真心好用,赞一个!

    相关文章

      网友评论

          本文标题:js 监听数组操作的两种方式;扩展对数组递归执行操作

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