原理
其实原理很简单,就是拦截了Object的get/set方法,在对数据进行set(obj.aget=18)时去重现渲染视图
实现方式有两种
定义了同名的get/set就相当于定义了age
var test = { _age: 18, get age() { console.log('触发get'); //直接会this.age会进入死递归的 return this._age; }, set age(age) { console.log('触发set'); this._age = age; } };
为了让test不显示多余的变量,可以把_age定义在外部
var _age = 18; var test = { get age() { console.log('触发get'); //直接会this.age会进入死递归的 return _age; }, set age(age) { console.log('触发set'); _age = age; } };
使用这种方式完美的解决了对象内包含多余的变量的问题
function test() { var _age = 18; Object.defineProperty(this, "age", { get: function () { console.log('触发get'); return _age; }, set: function (value) { console.log('触发set') _age = value; } }); } var t = new test(); t.age=18;
实现数据到视图的绑定
这里的渲染只是一个简单的正则替换
要实现Vue那么强大的功能还要自己实现一个模板引擎
<div id="test"> <p>name:</p> <p>age:</p> </div>
function Element(id, initData) { var self = this; var el = document.getElementById(id); var templet = el.innerHTML; var _data = null; if (initData) { _data = {}; for (var variable in initData) { _data[variable] = initData[variable]; bind(variable, self); } } function bind(variable, obj) { Object.defineProperty(self, variable, { set: function (value) { //使用_data里的数据,避免死递归 _data[variable] = value; //每次被设置新值的时候重新渲染界面 render(); }, get: function () { return _data[variable]; }, }); } //渲染 function render() { var temp = templet; temp = temp.replace(/\{\{(.*)\}\}/g, function (s, t) { if (_data[t]) { return _data[t]; } }); el.innerHTML = temp; } //初始化时候手动渲染一次 render(); } var app = new Element('test', { name: 'zhangsan', age: 18 })
实现视图到数据的绑定
这里做一个简单的input改变的事件监听
每次渲染之后都要重新添加事件,用时间委托可以实现,但是input的focus位置不能保留
可见Vue内部的渲染和事件绑定肯定不是像这里demo写的那么简单,这里只是大致的原理(可能并不是这样的。。。)
<div id="test"> <input type="text" value=""> <br> <span></span> </div>
function Element(id, initData) { var self = this; var el = document.getElementById(id); var templet = el.innerHTML; var input = el.getElementsByTagName('input')[0]; var _data = initData; Object.defineProperty(self, 'data', { set: function (value) { _data = value; render(); }, get: function () { return _data; }, }); //渲染 function render() { var temp = templet; temp = temp.replace(/\{\{(data)\}\}/g, function (s, t) { return _data; }); el.innerHTML = temp; //重新添加事件,其实应该用事件委托的 input = el.getElementsByTagName('input')[0]; inputchange(); input.focus(); } function inputchange() { if (window.attachEvent) { input.attachEvent("oninput", temp); } else if (window.addEventListener) { input.addEventListener("input", temp, false); } function temp() { self.data = input.value; } } //初始化时候手动渲染一次 render(); } var app = new Element('test', '');
以上就是Vue 数据绑定的原理分析的详细内容,更多关于Vue 数据绑定的资料请关注小牛知识库其它相关文章!
本文向大家介绍浅谈Vue数据绑定的原理,包括了浅谈Vue数据绑定的原理的使用技巧和注意事项,需要的朋友参考一下 本文介绍了Vue数据绑定的原理,分享给大家,具体如下: 原理 其实原理很简单,就是拦截了Object的get/set方法,在对数据进行set (obj.aget=18) 时去重现渲染视图 实现方式有两种 方式1 定义了同名的get/set就相当于定义了age 为了让test不显示多余的变
本文向大家介绍Vue双向数据绑定(MVVM)的原理,包括了Vue双向数据绑定(MVVM)的原理的使用技巧和注意事项,需要的朋友参考一下 MVVM MVVM 是Model-View-ViewModel 的缩写,它是一种基于前端开发的架构模式,其核心是提供对View 和 ViewModel 的双向数据绑定,这使得ViewModel 的状态改变可以自动传递给 View,即所谓的数据双向绑定。 V
本文向大家介绍浅谈vue,angular,react数据双向绑定原理分析,包括了浅谈vue,angular,react数据双向绑定原理分析的使用技巧和注意事项,需要的朋友参考一下 传统做法 前端维护状态,手动操作DOM更新视图。前端框架对服务器数据通过模版进行渲染。当用户产生了一个动作之后,我们通过document.getElementBy... 手动进行DOM更新。 框架帮忙分离数据和视图,后续
本文向大家介绍Vue数据双向绑定原理实例解析,包括了Vue数据双向绑定原理实例解析的使用技巧和注意事项,需要的朋友参考一下 Vue数据双向绑定原理是通过数据劫持结合发布者-订阅者模式的方式来实现的,首先是对数据进行监听,然后当监听的属性发生变化时则告诉订阅者是否要更新,若更新就会执行对应的更新函数从而更新视图 MVC模式 以往的MVC模式是单向绑定,即Model绑定到View,当我们用JavaSc
本文向大家介绍详解Vue双向数据绑定原理解析,包括了详解Vue双向数据绑定原理解析的使用技巧和注意事项,需要的朋友参考一下 基本原理 Vue.采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,数据变动时发布消息给订阅者,触发相应函数的回调。 思路整理 要实现mvvm的双向绑定,需要实现如下几点: 1.实现一个数据
本文向大家介绍vue双向绑定原理?相关面试题,主要包含被问及vue双向绑定原理?时的应答技巧和注意事项,需要的朋友参考一下 参考回答: vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式来实现的。利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)。