logo头像

爱分享 爱生活 爱编程

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Vue原理</title>
</head>
<body>
    <script src="./index.js"></script>
    <script>
        let vm = new myVue({
            data: {
                age: 12,
                score: {
                    math: 99,
                    english: 89
                }
            }
        })        
    </script>
</body>
</html>
class myVue {
    constructor(options) {
        this._options = options;
        this.$data = options.data;
        this._initData()
    }
<!-- more -->

    _initData() {
        let data = this.$data
        let keys = Object.keys(data)
        // 数据代理
        // 实现 vm.a 可以拿到 示例中 data的a的值
        for (let index = 0; index < keys.length; index++) {
            Object.defineProperty(this, keys[index], {
                enumerable: true, // 可遍历
                configurable: true, // 可被改写
                get: function proxyGetter() {
                    return data[keys[index]]
                },
                set: function proxySetter(val) {
                    data[keys[index]] = val
                }
            })
        }
        // 数据劫持,data 中的任意数据有变动时 进行劫持
        observe(data)
    }


}
// 判断data是否是基础类型, 递归数data据劫持
function observe(data) {
    // 使用Object.prototype上的原生toString()方法判断数据类型
    // 参考链接:https://blog.csdn.net/u012158998/article/details/86423270
    // 判断 data 属性是否是 数组或者 对象类型
    const type = Object.prototype.toString.call(data)
    if (type !== "[object Array]" && type !== "[object Object]") { // 基础类型无需遍历
        return;
    }

    // 递归处理 数据劫持
    new Observer(data)
}

/**
 * 4. 实现数据劫持工具方法
 * @param {*} obj 要劫持的数据
 * @param {*} objKey 劫持数据的类型
 * @param {*} value  劫持数据的原始值
 */
function defineReactive(obj, objKey, value) {
    // 判断下是否可以继续遍历,由内向外的遍历
    observe(obj[objKey])
    Object.defineProperty(obj, objKey, {
        enumerable: true, // 可遍历
        configurable: true, // 可被改写
        get: function proxyGetter() {
            console.log(`${objKey}取值`);
            return value
        },
        set: function proxySetter(val) {
            console.log(`${objKey}发生了改变`);
            value = val
        }
    })
}
// 
class Observer {
    constructor(data) {
        this._walk(data)
    }

    _walk(data) {
        let keys = Object.keys(data)
        for (let index = 0; index < keys.length; index++) {
            // 针对每一层开始遍历数据并劫持
            defineReactive(data, keys[index], data[keys[index]])
        }
    }
}

前提

  • win10 专业版

如果安装的是 win10 企业版本呢,由于太纯净了,连应用商店都没有,我们需要自己去下载一下应用商店

  • 开启 Linux 子系统服务

    操作 步骤:

    1. 打开 控制面板
    2. 找到 程序
    3. 点击 启用或关闭 Windows 功能
    4. 在差不多倒数的几个,找到 适用于Linux 的 Windows 子系统打勾,等待安装好后,重启电脑
  • 安装 Linux 子系统

    1. 打开 应用商店,如果没有登陆,需要实现登录 一下
    2. 搜索 Linux
    3. 选择 Ubuntu 18.04 LTS 选择安装,如果下载速度较慢,可以打开传递优化
    4. 等待下载好后,直接启动就好,此处一般时间比较长,请耐心等待,开启后,设置自己的 用户名密码
  • 启动配置 Ubuntu

    这里可以根据自身来配置一些东西,比如替换镜像为国内阿里源,具体的配置还需要,自己去查就好,

    如果要使用 root 权限,直接使用 sudo + commend 就好

安装编辑器

这里可选择 vscode 为例,因为 vsCode 有现成的插件可以很好的在 wsl 中调试代码、共享文件