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

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);        

 介绍完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>
时间: 2024-12-28 01:57:05

vue中数据双向绑定的实现原理的相关文章

vue中数据双向绑定注意点

最近一个vue和element的项目中遇到了一个问题: 动态生成的对象进行双向绑定是失败 直接贴代码: <el-form :model="addClass" :rules="rules" ref="addClass"> <el-form-item label="表单分类名称" prop="NAME" :label-width="formLabelWidth"> &

Vue实现数据双向绑定的原理

Vue实现数据双向绑定的原理:Object.defineProperty() vue实现数据双向绑定主要是:采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应监听回调.当把一个普通 Javascript 对象传给 Vue 实例来作为它的 data 选项时,Vue 将遍历它的属性,用 Object.defineProperty 将它们转为 getter/setter.用户看不

AngularJS学习--- AngularJS中数据双向绑定(two-way data-binding) orderBy step4

1.切换工作目录 git checkout step-4 #切换分支,切换到第4步 npm start #启动项目 2.代码 app/index.html Search: <input ng-model="query"> Sort by: <select ng-model="orderProp"> <option value="name">Alphabetical</option> <opti

vue中的双向绑定

概述 今天对双向绑定感兴趣了,于是去查了下相关文章,发现有用脏检查的(angular.js),有用发布者-订阅者模式的(JQuery),也有用Object.defineProperty的(vue),其中用Object.defineProperty的(vue)特别简单,今天顺便记录下供以后开发时参考,相信对其他人也有用. 我参考了这篇文章:Vue.js双向绑定的实现原理. 类似双向绑定的效果 其实用事件代理就可以实现类似双向绑定的效果,原理是当检测到数据改动时会触发一个keyup事件或者表单的ch

VUE的数据双向绑定

1.概述 让我们先来看一下官网的这张数据绑定的说明图: 原理图告诉我们,a对象下面的b属性定义了getter.setter对属性进行劫持,当属性值改变是就会notify通知watch对象,而watch对象则会notify到view上对应的位置进行更新(这个地方还没讲清下面再讲),然后我们就看到了视图的更新了,反过来当在视图(如input)输入数据时,也会触发订阅者watch,更新最新的数据到data里面(图中的a.b),这样model数据就能实时响应view上的数据变化了,这样一个过程就是数据的

一、vue的数据双向绑定的实现

响应式系统 一.概述 Vue通过设定对象属性的 setter/getter 方法来监听数据的变化,通过getter进行依赖收集,而每个setter方法就是一个观察者,在数据变更的时候通知订阅者更新视图. 双向数据绑定,简单点来说分为三个部分: 1.Observer.这里的主要工作是递归地监听对象上的所有属性,在属性值改变的时候,触发相应的watcher. 2.Watcher.观察者,当监听的数据值修改时,执行响应的回调函数(Vue里面的更新模板内容). 3.Dep.连接Observer和Watc

js proxy 代理模拟vue实现数据双向绑定

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible"

利用原生JS实现VUE中的双向绑定

<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <input type="text" id="userName"> <br> <span id="

Vue数据双向绑定(面试必备) 极简版

我又来吹牛逼了,这次我们简单说一下vue的数据双向绑定,我们这次不背题,而是要你理解这个流程,保证读完就懂,逢人能讲,面试必过,如果没做到,请再来看一遍,走起: 介绍双向数据之前,我们先解释几个名词: 1.setter.getter 答:首先,别误以为他们就是一会要说的get.set, 原文地址:https://www.cnblogs.com/webcabana/p/11077628.html