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 相关文章推荐
JavaScript 中的replace方法说明
Apr 13 Javascript
基于jquery的一个图片hover的插件
Apr 24 Javascript
学习从实践开始之jQuery插件开发 菜单插件开发
May 03 Javascript
JavaScript中this关键词的使用技巧、工作原理以及注意事项
May 20 Javascript
jQuery的animate函数实现图文切换动画效果
May 03 Javascript
基于Bootstrap的后台管理面板 Bootstrap Metro Dashboard
Jun 17 Javascript
xmlplus组件设计系列之网格(DataGrid)(10)
May 05 Javascript
jQuery日期范围选择器附源码下载
May 23 jQuery
使用JavaScript中的lodash编写双色球效果
Jun 24 Javascript
Vue Prop属性功能与用法实例详解
Feb 23 Javascript
vue模仿网易云音乐的单页面应用
Apr 24 Javascript
javascript设计模式 ? 简单工厂模式原理与应用实例分析
Apr 09 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
如何删除多级目录
2006/10/09 PHP
深入PHP与浏览器缓存的分析
2013/06/03 PHP
phpmyadmin打开很慢的解决方法
2014/04/21 PHP
php基础设计模式大全(注册树模式、工厂模式、单列模式)
2015/08/31 PHP
PHP基于redis计数器类定义与用法示例
2018/02/08 PHP
php中上传文件的的解决方案
2018/09/25 PHP
Laravel timestamps 设置为unix时间戳的方法
2019/10/11 PHP
JS window.opener返回父页面的应用
2009/10/24 Javascript
JavaScript与DropDownList 区别分析
2010/01/01 Javascript
用javascript将数据导入Excel示例代码
2014/09/10 Javascript
jquery实现公告翻滚效果
2015/02/27 Javascript
基于jQuery插件实现环形图标菜单旋转切换特效
2015/05/15 Javascript
Highcharts学习之坐标轴
2016/08/02 Javascript
原生JS京东轮播图代码
2017/03/22 Javascript
javascript数据结构中栈的应用之符号平衡问题
2017/04/11 Javascript
js实现图片轮播效果学习笔记
2017/07/26 Javascript
jquery实现用户登陆界面(示例讲解)
2017/09/06 jQuery
js构造函数创建对象是否加new问题
2018/01/22 Javascript
Vue Router去掉url中默认的锚点#
2018/08/01 Javascript
js实现for循环跳过undefined值示例
2019/07/02 Javascript
JS实现滑动插件
2020/01/15 Javascript
原生JavaScript之es6中Class的用法分析
2020/02/23 Javascript
跟老齐学Python之玩转字符串(2)更新篇
2014/09/28 Python
详解使用 pyenv 管理多个版本 python 环境
2017/10/19 Python
Python OpenCV 直方图的计算与显示的方法示例
2018/02/08 Python
python如何创建TCP服务端和客户端
2018/08/26 Python
python 将大文件切分为多个小文件的实例
2019/01/14 Python
浅谈Python 列表字典赋值的陷阱
2019/01/20 Python
PyTorch的自适应池化Adaptive Pooling实例
2020/01/03 Python
Python3获取cookie常用三种方案
2020/10/05 Python
软件工程专业推荐信
2013/10/28 职场文书
情人节活动策划方案
2014/02/27 职场文书
经贸专业毕业生求职信
2014/03/23 职场文书
小学生竞选班干部演讲稿(5篇)
2014/09/12 职场文书
Python实现Excel文件的合并(以新冠疫情数据为例)
2022/03/20 Python
分析SQL窗口函数之聚合窗口函数
2022/04/21 Oracle