关于前端mvc或mvvm框架数据跟踪变化实现dom双向绑定的原理

一:最早的框架如backbone,实现对数据的变化监测是通过设置数据模型api。

  比如其model对象管理的是数据,而修改这些数据就是通过固定的方法(set)来触发事件从而更新dom,

<p id="dom">1</p>
var Model={
      a:1,
      b:2
}
var trigger=function(value){
      document.getElementById(‘dom‘).html(value)  //更新dom操作
}
var set=function(data,value){
      trigger(value)
}
set(Model.a,0)

二:angular框架,采用脏检查机制,当在dom中使用{{data}}绑定数据时就为此数据添加了一个观察器。

  当只要有数据更新时,就会遍历所有的观察器,如果该数据更新,就更新相应的dom。

三:react框架,原理是当某项数据发生更新时,按照新数据生成一个完整的虚拟dom,

  此时就有旧dom和新dom,然后使用它的差异算法计算出两个dom中不同的部分,最后在现实的dom中更新差异。

四:vue框架,原理和第一种很类似,不过通过一些方法使得最后的使用效果和angular以及react类似。

  当在注册Vue实例时,vue会将所有注册到data中的数据转换为set/get样式,转化的方式是通过Object.fefineProperty()实现的。

var vm=new Vue({
      data:{
              value:‘value‘
      }
})
Object.defineProperty(vm.$data,value,{
       set(newValue){
               console.log(‘我要变了‘);
               //通知该数据所有订阅者watcher更新,然后更新dom
       },
       get(){
               console.log(‘正在取值‘);
               //添加该数据的订阅者watcher
       }
})        

  

时间: 2024-10-01 03:08:37

关于前端mvc或mvvm框架数据跟踪变化实现dom双向绑定的原理的相关文章

迷你MVVM框架 avalonjs 学习教程21、双向绑定链

avalon的双向绑定机制,是通过一条依赖链实现.此依赖链最底层是监控属性.监控数组,中层是计算属性.监控函数,再上点是求值函数,最上层是视图刷新函数. 所谓计算属性,监控属性,监控函数属性,我们改变它们的值,它们会引发视图变化:而监控数组,是我们调用它的一些方法,也会引发视图变化. var vm = avalon.define({ a: "这是监控属性", $b: "这是非监控属性", $skipArray: ["c", "d&quo

前端mvc与mvvm

框架与库的最大区别就是代码的风格确认,库只是页面级别的选择,而架构则关注于整个程序的设计 MVC 作为软件中的99口诀,软件设计要是没个mvc就好像不是正规军一样,前端也是这样,将html理解为view,js理解为controller,js的通讯(主要指ajax)交互理解为model的获取,那么前端就是一个标准的mvc架构,其写法大致是这样的 html/view: <button class="btn btn-info" id='save'>提交</button>

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

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

Swift教程17-淡化MVC,使用MVVM框架开发轻巧便于维护的iOS/android app

MVVM是微软提出一种移动开发框架,旨在针对传统的MVC框架,解决传统的MVC框架的控制器的臃肿问题. M: Model模型,也就是数据模型;比如一条微博,对应的所有字段合成一条微博整体,这个整体就是Model V: View视图,只用来显示的视图,如 iOS的UIView,Cell;当然在 iOS中 Storyboard中,view总是和控制器关联,这并不是严格的view 如果我们纯手写代码定义一个view那么就是一个比较严格的view了 VM: ViewModel视图模型,是将一个 View

迷你MVVM框架 avalonjs 学习教程14、事件绑定

之前的章节许多示例代码也或多或少地展示了如何使用ms-click来绑定事件了.能直接在模板上绑定是事件,这也是静态模板与动态绑定的一大区别.ms-click不是简单的onclick的别名,它在内部屏蔽了浏览器的差异,并且对许多浏览器暂时不支持的事件做了兼容处理. 总的来说,事件绑定是使用ms-on-☆绑定来实现,但avalon也提供了许多快捷方式,让用户能直接以ms-eventName调用那些常用事件,如下 animationend. blur. change. input. click. db

第四十六课:MVC和MVVM的开发区别

实现MVC的目的就是为了让M和V相分离.前端的MVC无法做到View和Model的相分离,而MVVM可以. 我们先来看一个用MVC模式开发的经典例子:(一定要深入了解这种开发的思想,而不是看懂代码) $(function(){ //基本的Todo模型, var Todo = Backbone.Model.extend({ // 设置模型的默认属性 defaults: { content: "empty todo...", done: false }, //确保每一个模型的content

js实现一个简单的MVVM框架

以前都是默默地看园子里的文章,猥琐的点赞,今天也分享一下自己用js实现的一个简单mvvm框架. 最初只做了自动绑定事件,后面又参考学习了vue,knouckout以及argular实现方式,以及结合自己做WPF的一些经验,增加了属性绑定,今天又稍微整理了下,完善了部分功能,把代码提交到了码云:https://gitee.com/zlj_fy/Simple-MVVM 先简单介绍下用法: 1 <form class="form-horizontal" role="form&

剖析Vue原理&amp;实现双向绑定MVVM

剖析Vue原理&实现双向绑定MVVM vue.js 双向绑定 javascript 邓木琴居然被盗用了 2016年08月16日发布 推荐 24 推荐 收藏 195 收藏,10.6k 浏览 本文能帮你做什么?1.了解vue的双向数据绑定原理以及核心代码模块2.缓解好奇心的同时了解如何实现双向绑定为了便于说明原理与实现,本文相关代码主要摘自vue源码, 并进行了简化改造,相对较简陋,并未考虑到数组的处理.数据的循环依赖等,也难免存在一些问题,欢迎大家指正.不过这些并不会影响大家的阅读和理解,相信看完

mvvm双向绑定机制的原理和代码实现

mvvm框架的双向绑定,即当对象改变时,自动改变相关的dom元素的值,反之,当dom元素改变时,能自动更新对象的值,当然dom元素一般是指可输出的input元素. 1. 首先实现单向绑定,在指定对象的属性值发生改变时触发callback函数. 2. 单向绑定可采用ES5新增的defineProperty实现(或defineProperties),用了ES5注定就不支持IE9以下了,为了防止递归死循环问题,原有属性需要剪切到一个私有属性中保存. 3. 循环调用defineProperty定义闭包时