浅谈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 相关文章推荐
js 使用form表单select类实现级联菜单效果
Dec 19 Javascript
固定背景实现的背景滚动特效示例分享
May 19 Javascript
JavaScript事件学习小结(一)事件流
Jun 09 Javascript
BootStrap Validator使用注意事项(必看篇)
Sep 28 Javascript
微信小程序 template模板详解及实例代码
Mar 09 Javascript
vue2项目使用sass的示例代码
Jun 28 Javascript
简单的Vue SSR的示例代码
Jan 12 Javascript
JavaScript实现多叉树的递归遍历和非递归遍历算法操作示例
Feb 08 Javascript
jQuery中常用动画效果函数知识点整理
Aug 19 jQuery
Vue中图片Src使用变量的方法
Oct 30 Javascript
解决ele ui 表格表头太长问题的实现
Nov 13 Javascript
详解Node.js如何处理ES6模块
May 15 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基础知识:函数基础知识
2006/12/13 PHP
php实现的IMEI限制的短信验证码发送类
2015/05/05 PHP
asp函数split()对应php函数explode()
2019/02/27 PHP
javascript数组的扩展实现代码集合
2008/06/01 Javascript
一行代码告别document.getElementById
2012/06/01 Javascript
jQuery+CSS3折叠卡片式下拉列表框实现效果
2015/11/02 Javascript
教你JS中的运算符乘方、开方及变量格式转换
2016/08/09 Javascript
轻松掌握JavaScript中介者模式
2016/08/26 Javascript
JS 拦截全局ajax请求实例解析
2016/11/29 Javascript
Vue.js路由组件vue-router使用方法详解
2016/12/02 Javascript
解决URL地址中的中文乱码问题的办法
2017/02/10 Javascript
Angular2学习教程之组件中的DOM操作详解
2017/05/28 Javascript
详解Vue2.0里过滤器容易踩到的坑
2017/06/01 Javascript
vue2.5.2使用http请求获取静态json数据的实例代码
2018/02/27 Javascript
js循环map 获取所有的key和value的实现代码(json)
2018/05/09 Javascript
vue中轮训器的使用
2019/01/27 Javascript
nodejs如何在package.json中设置多条启动命令
2020/03/16 NodeJs
[01:11:10]2014 DOTA2华西杯精英邀请赛 5 24 iG VS VG加赛
2014/05/26 DOTA
Python break语句详解
2014/03/11 Python
零基础写python爬虫之使用Scrapy框架编写爬虫
2014/11/07 Python
Python中random模块用法实例分析
2015/05/19 Python
python生成九宫格图片
2018/11/19 Python
Python使用sklearn实现的各种回归算法示例
2019/07/04 Python
Python 处理文件的几种方式
2019/08/23 Python
Python实现Restful API的例子
2019/08/31 Python
简单了解python协程的相关知识
2019/08/31 Python
Python 实现毫秒级淘宝抢购脚本的示例代码
2019/09/16 Python
Python 基于wxpy库实现微信添加好友功能(简洁)
2019/11/29 Python
浅谈在django中使用filter()(即对QuerySet操作)时踩的坑
2020/03/31 Python
opencv 图像礼帽和图像黑帽的实现
2020/07/07 Python
利用Python发送邮件或发带附件的邮件
2020/11/12 Python
机电一体化应届生求职信范文
2014/01/24 职场文书
倡议书格式范文
2014/04/14 职场文书
护理专科毕业自荐信范文
2014/04/21 职场文书
长江三峡导游词
2015/01/31 职场文书
工程移交协议书
2016/03/24 职场文书