zoukankan      html  css  js  c++  java
  • 实现Vue-MVVM-step1

    一个利用defineProperty实现的MVVM双向数据绑

    <!DOCTYPE html>
    <html lang="en">
        <head>
            <meta charset="UTF-8">
            <title>Vue-MVVM</title>
        </head>
        <body>
            <input type="text" id="input1" value="" oninput="myFun()" />
            <input type="text" id="input2" />
        </body>
        <script>
            function myFun() {
                o._data.test = document.getElementById('input1').value
            }
            /* 这个函数用来模拟视图更新 */
            function cb(val) {
                console.log('试图更新啦~~');
                document.getElementById('input2').value = val
            }
            /* 遍历所有属性的方式对该对象的每一个属性都通过 defineReactive  */
            function observer(value) {
                if (!value || (typeof value !== 'object')) {
                    return;
                }
                Object.keys(value).forEach((key) => {
                    defineReactive(value, key, value[key]);
                })
            }
            /* 实现对对象的「响应式」 */
            function defineReactive(obj, key, val) {
                Object.defineProperty(obj, key, {
                    enumerable: true,        // 能否被遍历,比如 for in,默认值为 false
                    configurable: true,        // 描述该属性的描述符能否被改变,默认值为 false
                    get: function reactiveGetter() {        // 取值的时候调用,默认值为 false
                        return val;
                    },
                    set: function reactiveSetter(newVal) {        // 设置值的时候使用
                        if (newVal === val) return;
                        cb(newVal);
                    }
                });
            }
            /* 声明类 */
            class Vue {
                constructor(options) {
                    this._data = options.data;
                    observer(this._data)
                }
            }
            /* 创建实例 */
            var o = new Vue({
                data: {
                    test: ""
                }
            })
        </script>
    </html>
  • 相关阅读:
    用户态和内核态
    Spring Cloud构建微服务架构:服务网关(路由配置)【Dalston版】
    为什么说分布式事务不再适用于微服务架构
    基于selenium的二次开发
    Python常用方法
    深入浅出runloader
    python socket
    python API接口测试框架
    python装饰器
    python多进程安全
  • 原文地址:https://www.cnblogs.com/RuMengkai/p/9402500.html
Copyright © 2011-2022 走看看