Vue数据双向绑定原理
Vue数据双向绑定原理
先看效果图
//代码:
<div id="app">
<input v-model="name" type="text">
<h1>{{name}}</h1>
</div>
<script src="./js/observer.js"></script>
<script src="./js/watcher.js"></script>
<script src="./js/compile.js"></script>
<script src="./js/index.js"></script>
<script>
const vm = new Mvue({
el: "#app",
data: {
name: "我是摩登"
}
});
</script>
在说到数据的双线绑定前先熟悉下MVVM
什么是MVVM
MVVM 是 Model-View-ViewModel 的缩写。mvvm 是一种设计思想。Model 层代表数据模型,也可以在 Model 中定义数据修改和操作的业务逻辑;View 代表 UI 组件,它负责将数据模型转化成 UI 展现出来,ViewModel 是一个同步 View 和 Model 的对象。
在 MVVM 架构下,View 和 Model 之间并没有直接的联系,而是通过 ViewModel 进行交互,Model 和 ViewModel 之间的交互是双向的, 因此 View 数据的变化会同步到 Model 中,而 Model 数据的变化也会立即反应到 View 上。
ViewModel 通过双向数据绑定把 View 层和 Model 层连接了起来,而 View 和 Model 之间的同步工作完全是自动的,无需人为干涉,因此开发者只需关注业务逻辑,不需要手动操作 DOM, 不需要关注数据状态的同步问题,复杂的数据状态维护完全由 MVVM 来统一管理。
分析
我们都知道MVVM模式在于数据和视图层的同步,也就是说当视图层发生变化时数据也将发生变化.当数据发生变化时视图也会发生改变
视图成发生变化时我们可以通过事件监听即可
数据发生改变通知视图成方法
正题来了
当我们数据方式改变时我们可以通过 Object.defineProperty 自动触发set函数从而能够通知我们跟新视图.
数据双向绑定的原理
结合上面的分析我们可以得出Vue数据双向绑定是通过数据劫持结合* 发布订阅者模式 类实现的,我们也知道 数据劫持 * 是通过Object.defineProperty
方法,当我们知道这些后我们就需要一个监听器 Observer
来监听属性的变化,得知属性的变化后我们就需要一个Watcher
订阅者来更新视图,然后我们还需要一个compile
指令解析器,原来解析我们的节点元素的* 指令 * 和 * 初始化视图 *
Observer 监听器:用来监听属性的变化通知订阅者
Watcher 订阅者:收到属性的变化,然后更新视图
Compile 解析器:解析指令,初始化模版,绑定订阅者