Vue数据双向绑定底层实现原理


Posted in Javascript onNovember 22, 2019

简介:

Vue 最独特的特性之一,是其非侵入性的响应式系统。数据模型仅仅是普通的 JavaScript 对象。而当你修改它们时,视图会进行更新。简单的说,就是数据变视图变。

当你把一个普通的 JavaScript 对象传给 Vue 实例的 data 选项,Vue 将遍历此对象所有的属性,并使用 Object.defineProperty 把这些属性全部转为 getter/setter。Object.defineProperty 是 ES5 中一个无法 shim 的特性,这也就是为什么 Vue 不支持 IE8 以及更低版本浏览器。

下例为模拟,Vue数据双向绑定底层实现原理

<!DOCTYPE html>
<html>
<head>
  <meta charset="utf-8" />
  <meta http-equiv="X-UA-Compatible" content="IE=edge">
  <title>数据双向绑定底层实现</title>
</head>
<body>
  <button onclick="changeTest()">点我改变</button>
  <div id="test">哈哈哈</div>

  <script>
    let test={};
    let middle='';
    Object.defineProperty(test,'name',{
      set(val){
        console.log('触发setter');//设置、修改时触发set
        middle=val;
        watcher();
      },
      get(){
        console.log('触发geter');//获取、使用时触发get
        return middle;
      }
    })
    function changeTest(){
      test.name="变变变";//触发setter
    }
    function watcher(){
      document.getElementById('test').innerHTML=test.name;//触发get
    }
  </script>
</body>
</html>

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Javascript 相关文章推荐
JS实现仿百度输入框自动匹配功能的示例代码
Feb 19 Javascript
JQuery 在线引用及测试引用是否成功
Jun 24 Javascript
JQuery实现图片轮播效果
Sep 15 Javascript
jQuery-1.9.1源码分析系列(十)事件系统之事件包装
Nov 20 Javascript
jQuery实现无限往下滚动效果代码
Apr 16 Javascript
快速移动鼠标触发问题及解决方法(ECharts外部调用保存为图片操作及工作流接线mouseenter和mouseleave)
Aug 29 Javascript
强大的 Angular 表单验证功能详细介绍
May 23 Javascript
详解Vue爬坑之vuex初识
Jun 14 Javascript
代码详解Vuejs响应式原理
Dec 20 Javascript
Vue不能观察到数组length的变化
Jun 08 Javascript
js如何获取访问IP、地区、当前操作浏览器
Jul 23 Javascript
JavaScript实现轮播图效果
Oct 30 Javascript
Node如何后台数据库使用增删改查功能
Nov 21 #Javascript
vue移动端使用appClound拉起支付宝支付的实现方法
Nov 21 #Javascript
微信小程序动态设置图片大小的方法
Nov 21 #Javascript
通过原生vue添加滚动加载更多功能
Nov 21 #Javascript
小程序api实现promise封装过程解析
Nov 21 #Javascript
如何基于原生javaScript生成带图片的二维码
Nov 21 #Javascript
Vue中Table组件行内右键菜单实现方法(基于 vue + AntDesign)
Nov 21 #Javascript
You might like
DOTA2【瓜皮时刻】Vol.91 RTZ山史最惨“矿难”
2021/03/05 DOTA
PHP安装攻略:常见问题解答(三)
2006/10/09 PHP
解析link_mysql的php版
2013/06/30 PHP
php+ajax实现无刷新分页的方法
2014/11/04 PHP
php实现根据IP地址获取其所在省市的方法
2015/04/30 PHP
PHP使用PDO操作sqlite数据库应用案例
2019/03/07 PHP
js 获取坐标 通过JS得到当前焦点(鼠标)的坐标属性
2013/01/04 Javascript
JS实现简单的顶部定时关闭层效果
2014/06/15 Javascript
JavaScript操作cookie类实例
2015/03/31 Javascript
基于jQuery Circlr插件实现产品图片360度旋转
2015/09/20 Javascript
理解javascript中的严格模式
2016/02/01 Javascript
JQuery的Pager分页器实现代码
2016/05/03 Javascript
Web程序员必备的7个JavaScript函数
2016/06/14 Javascript
图文详解Javascript中的上下文和作用域
2017/02/15 Javascript
完美实现js焦点轮播效果(二)(图片可滚动)
2017/03/07 Javascript
Vue组件的使用教程详解
2018/01/05 Javascript
JavaScript类型相关的常用操作总结
2019/02/14 Javascript
基于javascript的无缝滚动动画1
2020/08/07 Javascript
详解JavaScript的this指向和绑定
2020/09/08 Javascript
Win7上搭建Cocos2d-x 3.1.1开发环境
2014/07/03 Python
Python cookbook(数据结构与算法)对切片命名清除索引的方法
2018/03/13 Python
Python项目 基于Scapy实现SYN泛洪攻击的方法
2019/07/23 Python
用OpenCV进行年龄和性别检测的实现示例
2021/01/29 Python
美国当红的名品折扣网:Gilt Groupe
2016/08/15 全球购物
超级英雄、电影和电视、乐队和音乐T恤:Loud Clothing
2019/09/01 全球购物
办公室年终个人自我评价
2013/10/28 职场文书
销售会计岗位职责
2014/03/15 职场文书
企业授权委托书范本
2014/04/02 职场文书
2015年个人招商工作总结
2015/04/25 职场文书
男生贾里读书笔记
2015/06/30 职场文书
标枪加油稿
2015/07/22 职场文书
小学体育跳绳课教学反思
2016/02/16 职场文书
2017元旦、春节期间廉洁自律承诺书
2016/03/25 职场文书
基于python制作简易版学生信息管理系统
2021/04/20 Python
JPA如何使用entityManager执行SQL并指定返回类型
2021/06/15 Java/Android
解决vue自定义组件@click点击失效问题
2022/04/30 Vue.js