vue的双向数据绑定实现原理(简单)

如果有人问你,学vue学到了什么,那双向数据绑定,是必然要说的。

我们都知道,在vue中,使用数据双向绑定我们都知道是v-modle实现的。

实现原理是通过Object.defineProperty的方法实现的。

这个方法接收三个参数 obj要在其上定义属性的对象。prop要定义或修改的属性的名称。descriptor将被定义或修改的属性描述符。

还有一些属性描述符

其中的俩个,

get:不存在该属性时返回undefined 当访问这个属性的时候执行 有值是返回传进来的prop。

set:不存在该属性时返回undefined 当属性变化时执行 方法接收唯一参数,就是prop的新属性值。

这个方法的使用我就不多说了。详细的可以看一下这个:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty

理论:

双向数据绑定的原理就是劫持数据结合发布订阅者模式实现的。

步骤:

第一步:创建一个监听者,Oberver,监听属性变化,当属性变化的时候,通知订阅者。

第二步:创建一个订阅者,watcher 用来接收属于变化的通知并且执行相对应的方法,然后更新视图view。

第三部,创建一个解析器,compile ,可以扫描和解析每一个节点相关指令,还可以,初始化模板数据,和初始化相关订阅者

图解:

(图片来源https://segmentfault.com/a/1190000006599500

 

简单实现数据的双向绑定。

<!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" content="ie=edge">

<title>Document</title>

</head>

<body>

<div id="app">

<input type="text" id="a" >

<span id="b"></span>

</div>

</body>

<script>

var obj = {};

var val = ‘嘿嘿‘;

Object.defineProperty(obj,‘val‘,{

get:function(){

return val

},

set:function(newVal){

val = newVal;

document.getElementById(‘a‘).value = val;

document.getElementById(‘b‘).innerHTML= val;

}

})

document.addEventListener(‘keyup‘,function(e){

obj.val = e.target.value

})

</script>

</html>

这是简单版的,后面会更新更详细的版本

原文地址:https://www.cnblogs.com/chenyudi/p/12303841.html

时间: 2024-08-30 03:33:30

vue的双向数据绑定实现原理(简单)的相关文章

vue的双向数据绑定

这篇文章我会仿照vue写一个双向绑定的实例,主要实v-model  ,  v-bind  ,  v-click 1.原理 Vue的双向数据绑定的原理大家可能或多或少了解一点,主要是通过 Object 对象的 defineProperty 属性,重写data的 set 和 get 函数来实现的. 2.页面结构 包含了 一个input,使用v-model指令 一个button,使用v-click指令 一个h3,使用v-bind指令. 我们最后会通过类似于vue的方式来使用我们的双向数据绑定,结合我们

浅析vue的双向数据绑定

vue 的双向数据绑定是基于es5的 object对象的defineProperty属性,重写data的set和get函数来实现的.1.defineProperty 数据展示 1 Object.defineProperty(obj,'name',{ 2 configurable:true , // false则不可以删除key值 3 enumerable:true , // false则在枚举时候会忽略 4 value:'xixi' 5 writable:true // false则不可更改ke

Vue自定义v-model实现Vue的双向数据绑定--Vue高级特性

Vue高级特性 一.自定义v-model实现Vue的双向数据绑定 父组件中 <p>{{name}}</p> <custormModel v-model="name" /> data() { return { // 组件 custormModel 中的 input 输入改变,绑定到了这里,实现双向绑定 name: '颜色' } }, components: { custormModel } 组件custormModel <input type=&

深入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是采用数据劫持,并且使用发布-订阅者的开发模式.原理是观察者observer通过Object.defineProperty()来劫持到各个属性的getter setter,在数据变动的时候,会被observer观察到,会通过Dep通知数据的订阅者watcher,之后进行相应的视图上面的变化. 具体实现步骤: 第一步:需要observe的数据对象进行递归遍历,包括子属性对象的属性,都加上 setter和getter 这样的话,给这个对象的某个值赋值,就会触发setter,那么就能监听到了数据

简单实现VUE的双向数据绑定

<!DOCTYPE html> <html> <head> <title>vue-双向数据绑定的简单实现</title> </head> <body> <input type="text" name="" id="inputText"> <span id='textSpan'></span> <script type=&q

聊聊 Vue 的双向数据绑定,Model 如何改变 View,View 又是如何改变 Model 的

VM 主要做了两件微小的事情: 从 M 到 V 的映射(Data Binding),这样可以大量节省你人肉来 update View 的代码(将数据绑定到view) 从 V 到 M 的事件监听(DOM Listeners),这样你的 Model 会随着 View 触发事件而改变 (view改变的时候改变数据) 1.M 到 V 实现 做到这件事的第一步是形成类似于: // template var tpl = '<p>{{ text }}</p>'; // data var data

Vue.js双向数据绑定模板渲染

准备知识 1. 前端开发基础 html.css.js2. 前端模块化基础3. 对ES6有初步的了解 vuejs官网:cn.vuejs.org HTML: <!DOCTYPE html> <html lang="zh-cn"> <head> <meta charset="UTF-8"> <title>Vuejs</title> <style> .finished { text-deco

浅谈Vue之双向绑定

VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的.先看个例子 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=dev