vue的双向绑定原理浅析与简单实现

很久之前看过vue的一些原理,对其中的双向绑定原理也有一定程度上的了解,只是最近才在项目上使用vue,这才决定好好了解下vue的实现原理,因此这里对vue的双向绑定原理进行浅析,并做一个简单的实现。

vue双向绑定的原理浅析

vue数据的双向绑定是通过数据劫持,并结合发布-订阅模式的方式来实现的。

我们先通过一个最简单的vue例子来查看vue初始化数据上的对象到底是什么东西。

var vm = new Vue({
    data: { // 双向绑定的数据对象
        obj: {
            a: 1
        }
    },
    created: function () { // 初始化事件
        console.log(this.obj);
    }
});

通过控制台打印,我们可以看到属性a有两个相对应的get方法和set方法,这两个方法的生成,是Object.defineProperty()方法来决定的。这样我们就可以知道,vue是通过Object.defineProperty()方法来实现数据劫持,然后在其中的get方法和set方法做相应的操作来实现数据的双向绑定的。

Object.defineProperty()方法的get和set属性

Object.defineProperty()方法可以用来控制一个对象的一些特有操作,比如读写权、是否可以枚举等,这里只简单分析它对应的两个描述属性get和set,这两个属性对应的属性值是函数。要了解这个方法的更多属性,可以参考MDN文档:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

如果你开发过Java应用,很容易就能想到get方法和set方法是用来获取和设置对象的属性值的,同时还能通过在get方法和set方法中添加一些特定的代码来操作属性值,而在这里,情况其实并没有什么不同。顾名思义,get方法就是在读取对象的属性值的时候触发的事件函数,set方法啊就是在设置对象的属性值的时候触发的事件函数。

简单实现

要实现mvvm的双向绑定是需要另外的一些操作的,比如发布-订阅模式的应用和dom操作等,这里只简单实现其中的数据劫持,对其他的原理不做深入探讨。

var Person = {}; // 定义一个Person对象
var name = ‘‘; // 定义一个name属性
// 给Person对象的name属性绑定get和set事件函数
Object.defineProperty(Person, ‘name‘, {
  set: function (value) {
    name = value;
    console.log(‘我爱的人是‘ + value);
  },
  get: function () {
    return ‘我爱‘ + name;
  }
})

Person.name = ‘yanggb‘;  // 我爱的人是yanggb
console.log(Person.name);  // 我爱yanggb

这样,我们就在设置和读取Person对象的name属性的时候做了一些额外的增强操作,vue就是基于这种方法来进行对数据的劫持的。

"我还是很喜欢你,像云在风中绵绵,不问所起。"

原文地址:https://www.cnblogs.com/yanggb/p/11406517.html

时间: 2024-10-08 06:40:05

vue的双向绑定原理浅析与简单实现的相关文章

vue的双向绑定原理及实现

前言 使用vue也好有一段时间了,虽然对其双向绑定原理也有了解个大概,但也没好好探究下其原理实现,所以这次特意花了几晚时间查阅资料和阅读相关源码,自己也实现一个简单版vue的双向绑定版本,先上个成果图来吸引各位: 代码:                                                                    效果图:   是不是看起来跟vue的使用方式差不多?接下来就来从原理到实现,从简到难一步一步来实现这个SelfVue.由于本文只是为了学习和分享

Vue数据双向绑定原理及简单实现

嘿,Goodgirl and GoodBoy,点进来了就看完点个赞再go. Vue这个框架就不简单介绍了,它最大的特性就是数据的双向绑定以及虚拟dom.核心就是用数据来驱动视图层的改变.先看一段代码. 一.示例 var vm = new Vue({ data: { obj: { a: 1 } }, created: function () { console.log(this.obj); } }); 二.实现原理 vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的. 1)数据劫

Vue.js双向绑定原理

Vue.js最核心的功能有两个,一个是响应式的数据绑定系统,另一个是组件系统.本文仅仅探究双向绑定是怎样实现的.先讲涉及的知识点,再用简化的代码实现一个简单的hello world示例. 一.访问器属性 访问器属性是对象中的一种特殊属性,它不能直接在对象中设置,而必须通过defineProperty()方法单独定义. <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <titl

Vue的双向绑定原理

Vue的构造函数分析 vm就是MVVM中的View Model var vm = new Vue({ el: '#app', data: { message: 'Hello Vue!' } }) /* 相关于Vue的构造函数 */ function Vue(options) { // 将选项对象保存到vm this.$options = options; // 将data对象保存到vm和data变量中 var data = this._data = this.$options.data; //将

深入vue源码,了解vue的双向数据绑定原理

大家都知道vue是一种MVVM开发模式,数据驱动视图的前端框架,并且内部已经实现了双向数据绑定,那么双向数据绑定是怎么实现的呢? 先手动撸一个最最最简单的双向数据绑定 1 <div> 2 <input type="text" name="" id="text"> 3 <span id="show"></span> 4 </div> 5 6 <script>

[Vue源码]一起来学Vue双向绑定原理-数据劫持和发布订阅

有一段时间没有更新技术博文了,因为这段时间埋下头来看Vue源码了.本文我们一起通过学习双向绑定原理来分析Vue源码.预计接下来会围绕Vue源码来整理一些文章,如下. 一起来学Vue双向绑定原理-数据劫持和发布订阅 一起来学Vue模板编译原理(一)-Template生成AST 一起来学Vue模板编译原理(二)-AST生成Render字符串 一起来学Vue虚拟DOM解析-Virtual Dom实现和Dom-diff算法 这些文章统一放在我的git仓库:https://github.com/yzsun

Vue.js双向绑定的实现原理

Vue.js最核心的功能有两个,一是响应式的数据绑定系统,二是组件系统.本文仅探究几乎所有Vue的开篇介绍都会提到的hello world双向绑定是怎样实现的.先讲涉及的知识点,再参考源码,用尽可能少的代码实现那个hello world开篇示例. 参考文章:https://segmentfault.com/a/1190000006599500 一.访问器属性 访问器属性是对象中的一种特殊属性,它不能直接在对象中设置,而必须通过defineProperty()方法单独定义. var obj = {

vue双向绑定原理

vue双向绑定原理的核心 它的实现的核心是通过Object.defineProperty(),对data的每个属性进行了get.set的拦截. 其实只要Object.defineProperty()已经可以实现双向绑定,只是这样做效率非常低. 观察者模式 它在双向绑定当中是什么角色呢? 它其实是让双向绑定更有效率 为什么? 观察者模式,它是一对多的一种模式,在vue里面,"一"是改了某一data数据,"多"是页面上凡是用了这个数据的地方,都更新.这就是页面上的很多&

事件双向绑定原理

事件 案例: vue的事件绑定原理:改变图片的背景颜色问题来实现这个框架的使用方法, new Vue({ el:"", data:{}, methord:{}, computed:{}   计算属性的使用:用于大量基于数据模型的计算,但并不是每一次渲染都发生更改,计算属性就会将数据直接返回,这样提高计算效率. mounthd:{} }) 我们在事件绑定的时候传入参数:比如点击事件,@click=“funname($event,index)” <!DOCTYPE html>