聊聊 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 = {
text: ‘This is some text‘
};
// magic process
template(tpl, data); // ‘<p>This is some text</p>‘

中间的 magic process 是模板引擎所做的事情,已经有非常多种模板引擎可供选择

当然你比较喜欢造轮子的话也可以自己实现一个

无论是 Angular 的 $scope,React 的 state 还是 Vue 的 data 都提供了一个较为核心的 model 对象用来保存模型的状态;它们的模板引擎稍有差别,不过大体思路相似;拿到渲染后的 string 接下来做什么不言而喻了(中间还有很多处理,例如利用 model 的 diff 来最小量更新 view )。

但是仅仅是这样并不够,我们需要知道什么时候来更新 view( 即 render ),一般来说主要的 VM 做了以下几种选择:

  • VM 实例初始化时
  • model 动态修改时

其中初始化拿到 model 对象然后 render 没什么好讲的;model 被修改的时候如何监听属性的改变是一个问题,目前有以下几种思路:

  • 借助于 Object 的 observe 方法
  • 自己在 set,以及数组的常用操作里触发 change 事件
  • 手动 setState(),然后在里面触发 change 事件

知道了触发 render 的时机以及如何 render,一个简单的 M 到 V 映射就实现了。

2、V 到 M 实现

从 V 到 M 主要由两类( 虽然本质上都是监听 DOM )构成,一类是用户自定义的 listener, 一类是 VM 自动处理的含有 value 属性元素的 listener

第一类类似于你在 Vue 里用 v-on 时绑定的那样,VM 在实例化得时候可以将所有用户自定义的 listener 一次性代理到根元素上,这些 listener 可以访问到你的 model 对象,这样你就可以在 listener 中改变 model

第二类类似于对含有 v-model 与 value 元素的自动处理,我们期望的是例如在一个输入框内

<input type="text" v-model="message" />

输入值,那么我与之对应的 model 属性 message 也会随之改变,相当于 VM 做了一个默认的 listener,它会监听这些元素的改变然后自动改变 model,具体如何实现相信你也明白了

原文地址:https://www.cnblogs.com/wangxi01/p/11208090.html

时间: 2024-11-10 14:47:17

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

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写一个双向绑定的实例,主要实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源码,了解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中,使用数据双向绑定我们都知道是v-modle实现的. 实现原理是通过Object.defineProperty的方法实现的. 这个方法接收三个参数 obj要在其上定义属性的对象.prop要定义或修改的属性的名称.descriptor将被定义或修改的属性描述符. 还有一些属性描述符 其中的俩个, get:不存在该属性时返回undefined 当访问这个属性的时候执行 有值是返回传进来的prop. set:不存在

Vue原理--双向数据绑定

数据劫持 vue.js 是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter,getter,在数据变动时发布消息给订阅者,触发相应的监听回调. Object.defineProperty() Object.defineProperty() 方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象. Object.defineProperty(obj, prop, descriptor) 参数: obj

Vue的双向数据绑定原理是什么?

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

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的双向数据绑定

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