zoukankan      html  css  js  c++  java
  • Vue的双向数据绑定原理

    1、属性类型

    Object属性分为两个类型:数据属性、访问器属性,每类属性又有其不同的特显,双向绑定的原理是根据其访问器属性的特性来实现的。

    1.1数据属性的特性

    数据属性有四个描述其行为的特性
    1、Configurable:是否可以通过delete删除,能否修改他的属性特性,能否修改为访问器属性。默认值true
    2、Enumerable:是否可以通过for in循环返回改属性
    3、Writable:是否能修改属性值
    4、Value:属性值

    要就修改数据属性的默认特性,需要用Object.defineProperty()方法

    var person = {}
    Object.defineProperty(person,"name",{
        writable:false;
        value:'Nicholas';
    })

    1.2访问器属性特性

    1、Configurable:是否可以删除
    2、Enumerable:是否能够循环返回属性
    3、Get:在读取属性的时候调用的函数。默认值是undefind
    4、Set:在写入属性时调用的函数。
    访问器属性不能直接定义,必须使用Object.defineProperty()来定义。

    var book = {
      _year:2014,
      edition:1
    };
    
    Object.defineProperty(book,"year",{
      get:function(){
       return this._year
      },
      set:function(newValue){
       if(newValue>2004){
         this._year = newValue;
         this.editon +=newValue -2004;
       }
      }
    });
    
    book.year = 2005;
    alert(book.edition);  //2

    2、定义多个属性

    var book = {};
    Object.defineProperties(book,{
        //数据属性
        _year:{
            writable:true,
            value:2004
        },
        edition:{
            writable:true,
            value:1
        },
        //访问器属性
        year:{
            get:()=>{
                return this._year;
            },
            set:(newValue)=>{
                if(newValue>2004){
                    this._year = newValue;
                    this.edition += newValue -2004;
                }
            }
        }
    })

    3、读取属性特性

    var descriptor = Object.getOwnPropertyDescriptor(book,"year");
    alert(descriptor.value);  //undefind  访问属性没有value值
    alert(descriptot.get);  //funtion

    vi设计http://www.maiqicn.com 办公资源网站大全https://www.wode007.com

    4、模拟双向绑定

    <div id="app">
        <input type="text" id="txt">
        <p id="show-txt"></p>
    </div>
    <script>
        var obj = {}
        Object.defineProperties(obj,{
            _txt:{
                writable:true,
                value:'测试'
            },
            txt:{
                get: function () {
                    return obj
                },
    
                set: function (newValue) {
                    document.getElementById('txt').value = newValue
                    document.getElementById('show-txt').innerhtml = newValue
                }
            }
        })
    
        document.addEventListener('keyup', function (e) {
            obj.txt = e.target.value
        });
        console.log(bj.txt)  //或者txt值
    </script>
  • 相关阅读:
    unity panel删除drawcall失败导致的残留影像
    c# List的排序
    动画播放一段就禁用
    delegate用法
    ctrl+alt+end 修改桌面密码
    Windows 下curl htpps
    Linux下端口映射工具rinetd
    Linux系统下强制踢掉登录用户
    linux ls 按文件大小排序
    chrome的功能Copy as cURL
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/13749698.html
Copyright © 2011-2022 走看看