zoukankan      html  css  js  c++  java
  • vue入门学习篇——数据双向绑定原理及简单实现

    vue数据双向绑定原理

      vue双向绑定的原理是通过Object.defineProperty()劫持数据结合发布者-订阅者模式的方式来实现的。

    Object.defineProperty()

      Object.defineProperty()方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象。

     语法:Object.defineProperty(obj,prop,descriptor);
    
        obj: 要在其上定义属性的对象。
    
        prop: 要定义或修改的属性的名称。
    
        descriptor: 将被定义或修改的属性描述符。

      这里用到了Object.defineProperty()的get和set方法。

      get:当访问该属性时,该方法会被执行,方法执行时没有参数传入,但是会传入this对象(由于继承关系,这里的this并不一定是定义该属性的对象)。

      set:当属性值修改时,触发执行该方法。该方法将接受唯一参数,即该属性新的参数值。

    具体用法请浏览此处

     简单实现

    <input type="text" id="model" />
    <div id="modelText"></div>
        let modelInfo = {};
        let defaultValue = 'Hello Object.defineProperty';
        let model = document.getElementById('model');
        let text = document.getElementById('modelText');
        model.value = defaultValue;
        text.innerText = defaultValue;
        /**
         * writable属性的值是否可以被重写。设置为true可以被重写;设置为false,不能被重写。默认为false。
         * value属性对应的值,可以使任意类型的值,默认为undefined
         * configuable是否可以删除目标属性或是否可以再次修改属性的特性(writable, configurable, enumerable)。设置为true可以被删除或可以重新设置特性;设置为false,不能被可以被删除或不可以重新设置特性。默认为false。
         * enumerable此属性是否可以被枚举(使用for...in或Object.keys())。设置为true可以被枚举;设置为false,不能被枚举。默认为false。
         */
        Object.defineProperty(modelInfo,'key',{
            get(){
                return defaultValue;
            },
            set(value){
                defaultValue = value;
                model.value = value;
                text.innerText = value;
            }
        });
        model.addEventListener('input',function(){
            modelInfo.key = this.value;
        });

    如果想要深入了解,建议看vue的双向绑定原理及实现

  • 相关阅读:
    python flsak 框架
    postman
    压力测试和负载测试
    软件测试相关内容
    Linux常用基本命令
    leetcode刷题——反转字符串
    leetcode——搜索插入位置
    leetcode刷题——移除元素
    leetcode 刷题 ——删除排序数组中的重复项
    json.decoder.JSONDecodeError: Expecting value 错误的处理
  • 原文地址:https://www.cnblogs.com/hess/p/10874972.html
Copyright © 2011-2022 走看看