浅谈vue中数据双向绑定的实现原理


Posted in Javascript onSeptember 14, 2017

vue中最常见的属v-model这个数据双向绑定了,很好奇它是如何实现的呢?尝试着用原生的JS去实现一下。

首先大致学习了解下Object.defineProperty()这个东东吧!

* Object.defineProperty()
    *  对对象的属性进行 定义/修改
    * */

    let obj = {x:10}
    // 这两种方式都相对来说比较简单,直接,但是有些时候我们需要对对象的属性的修改和增加进行必要的干预
//    obj.y = 20;
//    obj.x = 100;
//    obj.x = 'abc';
//
//    let arr = [1,2,3];
//    arr.length = 'abc';//不可更改
//    console.log(arr);

//    console.log(obj.x);
//    delete obj.x;
//    console.log(obj);

    Object.defineProperty(obj, 'y', {
      configurable: false,  //设置是否可删除 false为不可删除
      value: 100
    });

    console.log(obj);
    delete obj.y;//删除
    console.log(obj);
    //设置对象某个属性值的时候,顺便设置它的属性。enumerable 可枚举 configurable 可以删除否 writable 可改值否
    Object.defineProperty(obj, 'z', {//enumerable 可枚举(没有则新添加) 
      enumerable: true,//为false时,for..in object.keys json.stringfy 不能取到该z属性
      value: 10000
    });

    for (var attr in obj) {
      console.log(attr);
    }

    Object.defineProperty(obj, 'm', {
      writable: false,//可更改
      value: 9
    });

    console.log(obj);
    obj.m = 100;
    console.log(obj);

以上总结了对象的defineProperty四个属性:configurable,enumerable,value,writable

接下来再深入认识下它的另外两个方法:set 以及get

注意:get和set不能与configurable,enumerable,value,writable同时存在

let obj = {x:10}

    let y = 100;
    Object.defineProperty(obj, 'y', {
      get() {
        //当obj的y属性被调用的时候触发,该方法的返回值将作为获取的结果
        console.log('get');
        return y;
      },
      set(value) {
        //当obj的y属性被设置的时候触发
        console.log('set', value);
        y = value;
      }
    })

    console.log(obj.y);
    obj.y = 1;
    console.log(obj.y);

浅谈vue中数据双向绑定的实现原理

介绍完defineProperty了,最后我们一起看看如何简单的实现数据双向绑定吧!

<body>

  <input type="text" id="age">
  <h1></h1>

  <script>

    var ageElement = document.querySelector('#age');
    var h1Element = document.querySelector('h1');

    let obj = {};

    Object.defineProperty(obj, 'age', {
      get() {

      },
      set(value) {
        ageElement.value = value;
        h1Element.innerHTML = value;
      }
    })

    obj.age = 10;

    ageElement.oninput = function() {
      obj.age = this.value;
    }
    
  </script>

浅谈vue中数据双向绑定的实现原理

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
jquery+ajax每秒向后台发送请求数据然后返回页面的代码
Jan 17 Javascript
js实现屏蔽默认快捷键调用自定义事件示例
Jun 18 Javascript
JavaScript获取鼠标移动时的坐标(兼容IE8、chome谷歌、Firefox)
Sep 13 Javascript
jQuery插件windowScroll实现单屏滚动特效
Jul 14 Javascript
javascript实现在指定元素中垂直水平居中
Sep 13 Javascript
高效利用Angular中内置服务$http、$location等
Mar 22 Javascript
KnockoutJS 3.X API 第四章之数据控制流if绑定和ifnot绑定
Oct 10 Javascript
JavaScript+Html5实现按钮复制文字到剪切板功能(手机网页兼容)
Mar 30 Javascript
自定义PC微信扫码登录样式写法
Dec 12 Javascript
vue的全局提示框组件实例代码
Feb 26 Javascript
深入浅析Vue中mixin和extend的区别和使用场景
Aug 01 Javascript
js 根据对象数组中的属性进行排序实现代码
Sep 12 Javascript
JavaScript动态绑定详解
Sep 14 #Javascript
React-Native使用Mobx实现购物车功能
Sep 14 #Javascript
JavaScript requestAnimationFrame动画详解
Sep 14 #Javascript
SVG动画vivus.js库使用小结(实例代码)
Sep 14 #Javascript
浅谈AngularJS中使用$resource(已更新)
Sep 14 #Javascript
jQuery plugin animsition使用小结
Sep 14 #jQuery
angular.extend方法的具体使用
Sep 14 #Javascript
You might like
PHP编码转换
2012/11/05 PHP
php生成验证码,缩略图及水印图的类分享
2016/04/07 PHP
PHP实现用户登录的案例代码
2018/05/10 PHP
Laravel框架控制器的request与response用法示例
2019/09/30 PHP
asp.net+js 实现无刷新上传解析csv文件的代码
2010/05/17 Javascript
JS实现网页表格自动变大缩小的方法
2015/03/09 Javascript
JavaScript实现的链表数据结构实例
2015/04/02 Javascript
jquery如何获取元素的滚动条高度等实现代码
2015/10/19 Javascript
jQuery实现根据滚动条位置加载相应内容功能
2016/07/18 Javascript
js判断数组key是否存在(不用循环)的简单实例
2016/08/03 Javascript
JS制作类似选项卡切换的年历
2016/12/03 Javascript
详解Vue.js Mixins 混入使用
2017/09/15 Javascript
详解利用 Express 托管静态文件的方法
2017/09/18 Javascript
Vue之Vue.set动态新增对象属性方法
2018/02/23 Javascript
vue组件name的作用小结
2018/05/23 Javascript
基于vue2.0实现仿百度前端分页效果附实现代码
2018/10/30 Javascript
微信小程序实现页面分享onShareAppMessage
2019/08/12 Javascript
Bootstrap table 实现树形表格联动选中联动取消功能
2019/09/30 Javascript
在JavaScript中实现链式调用的实现
2019/12/24 Javascript
wxpython 学习笔记 第一天
2009/03/16 Python
Python中的map、reduce和filter浅析
2014/04/26 Python
Django框架模板注入操作示例【变量传递到模板】
2018/12/19 Python
python类的实例化问题解决
2019/08/31 Python
python 上下文管理器及自定义原理解析
2019/11/19 Python
Python内置方法实现字符串的秘钥加解密(推荐)
2019/12/09 Python
Ubuntu16安装Python3.9的实现步骤
2020/12/15 Python
俄罗斯奢侈品牌衣服、鞋子和配饰的在线商店:INTERMODA
2020/07/17 全球购物
医院后勤自我鉴定
2013/10/13 职场文书
师德师风自查材料
2014/10/14 职场文书
学校光盘行动倡议书
2015/04/28 职场文书
导游词之安徽醉翁亭
2020/01/10 职场文书
springboot中一些比较常用的注解总结
2021/06/11 Java/Android
pycharm代码删除恢复的方法
2021/06/26 Python
SQLServer中JSON文档型数据的查询问题解决
2021/06/27 SQL Server
2022漫威和DC电影上映作品
2022/04/05 欧美动漫
《仙剑客栈2》第一弹正式宣传片公开 年内发售
2022/04/07 其他游戏