• 手写vue observe数据劫持


    实现代码:

      

    class Vue {
        constructor(options) {
            //缓存参数
            this.$options = options;
            //需要监听的数据
            this.$data = options.data;
            //数据监听
            this.observe(this.$data);
        }
        observe(value) {
            if (!value || typeof value !== 'object') {
                return;
            }
            /*
                取到每个key和value 调用definReactive 进行数据劫持
            */
            Object.keys(value).forEach(key => {
                //深度监听
                if (typeof value[key] === 'object') {
                    this.observe(value[key]);
                }
                this.definReactive(value, key, value[key]);
            })
        }
        definReactive(obj, key, val) {
            Object.defineProperty(obj, key, {
                get() {
                    return val;
                },
                set(newVal) {
                    if (newVal === val) {
                        return;
                    }
                    val = newVal;
                    console.log(`${key}属性更新了:${val}`);
    
                }
            })
        }
    }

    测试代码:

    <!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>Document</title>
    </head>
    
    <body>
        <script src="./vue.js"></script>
        <script>
            const app = new Vue({
                data: {
                    test: "i am test",
                    foo: {
                        bar: "bar"
                    }
                }
            });
            app.$data.test = "hello world!!";
            app.$data.foo.bar = "oh my bar";
        </script>
    </body>
    
    </html>

    测试结果:

  • 相关阅读:
    LINK : fatal error LNK1123: 转换到 COFF 期间失败: 文件无效或损坏
    RTSP可用网络流
    Linux访问Github缓慢
    Ubu18.0-NVIDIA显卡驱动重装
    FFMPEG第一次学习
    QT-守护程序
    QT-局域网探测工具(简易版)--Ping
    QT-notepad++仿写
    Ubuntu 解压文件
    Ubuntu -换源
  • 原文地址:https://www.cnblogs.com/y-y-y-y/p/11864883.html
Copyright © 2020-2023  润新知