vue中view-model双向绑定基础原理解析

作者:程序員劝退师 时间:2024-05-28 15:53:17 

利用Object.defineProperty进行数据劫持

代码如下

<!DOCTYPE html>
<html lang="en">
<head>
 <meta charset="UTF-8">
 <meta name="viewport" content="width=device-width, initial-scale=1.0">
 <title>Vue V-M</title>
</head>
<body>
 <div id="ap">
   <input id="input" type="text"><br/>
   <div id="text"></div><br/>
   <button id="button" type="button">打印</button>
 </div>
 <script>
   var input = document.querySelector('#input');
   var text = document.querySelector("#text");
   var button = document.querySelector("#button");
   var data = {value:''};

Object.defineProperty(data, 'value', {
     get:function(){
       console.log('get value ',input.value);
       return input.value;
     },
     set:function(value){
       console.log('set value ',value);
       text.innerHTML = value;
       input.value = value;
     }
   });

input.addEventListener("keyup", function (e) {
     data.value = e.target.value;
   }, false)

button.addEventListener('click',function(e){
     console.log('data ',data);
   },false);
 </script>
</body>
</html>

vue双向绑定的原理总结

MVVM

视图模型双向绑定,是Model-View-ViewModel的缩写,也就是把MVC中的Controller演变成ViewModel。Model层代表数据模型,View代表UI组件,ViewModel是View和Model层的桥梁,数据会绑定到viewModel层并自动将数据渲染到页面中,视图变化的时候会通知viewModel层更新数据。以前是操作DOM结构更新视图,现在是数据驱动视图。

优点:
1.低耦合。视图(View)可以独立于Model变化和修改,一个Model可以绑定到不同的View上,当View变化的时候Model可以不变化,当Model变化的时候View也可以不变;
2.可重用性。你可以把一些视图逻辑放在一个Model里面,让很多View重用这段视图逻辑。
3.独立开发。开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计。
4.可测试。

数据(model)变化主动触发ui(view)变化,同时ui(view)变化主动触发数据(model)变化,当然这里的ui变化指定表单中的用户输入,可通俗的理解为:在单向绑定的基础上给可输入元素(input、textarea等)添加change(input)事件,来动态修改model和view

vue当中的双向绑定

vue.js是采用数据劫持结合发布者-订阅者模式的方式,通过Object.defineProperty()来劫持各个属性的setter和getter,在数据变动时发布消息给订阅者,触发相应的监听回调

使用 v-model / .sync 实现,v-model是 v-bind:value 和 v-on:input 的语法糖

  • v-bind:value 实现了 data &rArr; UI 的单向绑定

  • v-on:input 实现了 UI &rArr; data 的单向绑定

引申出这两个单向绑定如何实现

v-bind的实现

通过 Object.defineProperty API 给 data 创建 getter 和 setter,用于监听 data 的改变,data 一变就会安排改变 UI

v-on的实现

通过 template compiler 给 DOM 添加事件监听,DOM input 的值变了就会去修改 data。

Compile(指令解析器)

Compile主要做的事情是解析模板指令,将模板中变量替换成数据,然后初始化渲染页面视图,并将每个指令对应的节点绑定更新函数,添加鉴定数据的订阅者,一旦数据有变动,收到通知,更新视图

Observer(数据 * )

Observer的核心是通过Object.defineProprtty()来监听数据的变动,这个函数内部可以定义setter和getter,每当数据发生变化,就会触发setter。这时候Observer就要通知订阅者,订阅者就是Watcher

Watcher(订阅者)

Watcher订阅者作为Observer和Compile之间通信的桥梁,主要做的事情是:

  • 在自身实例化时往属性订阅器(dep)里面添加自己

  • 自身必须有一个update()方法

  • 待属性变动dep.notice()通知时,能调用自身的update()方法,并触发Compile中绑定的回调

来源:https://www.cnblogs.com/cxyqts/p/16802432.html

标签:vue,view-model,双向绑定
0
投稿

猜你喜欢

  • flask框架中的cookie和session使用

    2023-04-08 03:33:28
  • python实现双向链表原理

    2023-08-11 11:42:11
  • IE8网页显示不正常 用”兼容性视图”搞定

    2009-03-28 11:13:00
  • mysql 大表批量删除大量数据的实现方法

    2024-01-22 10:28:34
  • vue打包npm run build时候界面报错的解决

    2024-05-10 14:18:52
  • 用Python自动发邮件提醒你周末吃啥

    2022-04-10 11:44:28
  • python实现0到1之间的随机数方式

    2023-08-06 17:14:50
  • MySQL8.0.18配置多主一从

    2024-01-15 01:23:15
  • Python自动化测试框架之unittest使用详解

    2021-07-02 17:42:27
  • python-opencv颜色提取分割方法

    2022-01-22 06:26:23
  • 详解IOS微信上Vue单页面应用JSSDK签名失败解决方案

    2024-04-30 10:25:40
  • 多种方式实现js图片预览

    2024-04-23 09:24:44
  • 对python字典元素的添加与修改方法详解

    2023-10-19 09:36:04
  • Python Flask 上传文件测试示例

    2021-01-08 05:51:34
  • IE下修改<p>标签的innerHTML出错

    2007-11-11 10:12:00
  • Go语言文件读取的一些总结

    2024-04-27 15:30:45
  • jquery的$(document).ready()和onload的加载顺序

    2023-08-23 18:57:40
  • python负载均衡的简单实现方法

    2021-10-31 23:15:22
  • 简单谈谈Python中的闭包

    2021-10-20 12:50:46
  • Python 自动化处理Excel和Word实现自动办公

    2021-06-07 06:41:16
  • asp之家 网络编程 m.aspxhome.com