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 相关文章推荐
JQuery 构建客户/服务分离的链接模型中Table分页代码效率初探
Jan 22 Javascript
Jquery 1.42 checkbox 全选和反选代码
Mar 27 Javascript
Jquery AJAX 用于计算点击率(统计)
Jun 30 Javascript
js控制web打印(局部打印)方法整理
May 29 Javascript
javascript获取元素离文档各边距离的方法
Feb 13 Javascript
jQuery+JSON实现AJAX二级联动实例分析
Dec 18 Javascript
JavaScript中的Object对象学习教程
May 20 Javascript
Angular.js中ng-if、ng-show和ng-hide的区别介绍
Jan 20 Javascript
JavaScript中的遍历详解(多种遍历)
Apr 07 Javascript
JavaScript+Canvas实现彩色图片转换成黑白图片的方法分析
Jul 31 Javascript
cnpm加速Angular项目创建的方法
Sep 07 Javascript
Vue项目报错:Uncaught SyntaxError: Unexpected token
Nov 10 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
php自定义函数截取汉字长度
2014/05/15 PHP
PHP生成网站桌面快捷方式代码分享
2014/10/11 PHP
php脚本运行时的超时机制详解
2016/02/17 PHP
基于php数组中的索引数组和关联数组详解
2018/03/12 PHP
event.keyCode键码值表 附只能输入特定的字符串代码
2009/05/15 Javascript
flexigrid 参数说明
2010/11/23 Javascript
基于jquery &amp; json的省市区联动代码
2012/06/26 Javascript
jQuery中filter()和find()的区别深入了解
2013/09/25 Javascript
JS通过分析userAgent属性来判断浏览器的类型及版本
2014/03/28 Javascript
jQuery内置的AJAX功能和JSON的使用实例
2014/07/27 Javascript
Angularjs中使用轮播图指令swiper
2017/05/30 Javascript
vue实现图书管理demo详解
2017/10/17 Javascript
Vue2.0设置全局样式(less/sass和css)
2017/11/18 Javascript
详解Vue 中 extend 、component 、mixins 、extends 的区别
2017/12/20 Javascript
在 Angular中 使用 Lodash 的方法
2018/02/11 Javascript
手动用webpack搭建第一个ReactApp的示例
2018/04/11 Javascript
Vue下拉框回显并默认选中随机问题
2018/09/06 Javascript
如何实现一个简易版的vuex持久化工具
2019/09/11 Javascript
Vuex中实现数据状态查询与更改
2019/11/08 Javascript
[47:46]完美世界DOTA2联赛 Magma vs GXR 第三场 11.07
2020/11/10 DOTA
[42:48]完美世界DOTA2联赛PWL S3 Magma vs INK ICE 第二场 12.11
2020/12/16 DOTA
[57:31]DOTA2-DPC中国联赛 正赛 SAG vs CDEC BO3 第一场 2月1日
2021/03/11 DOTA
python 连续不等式语法糖实例
2020/04/15 Python
Right-on官方网站:日本知名的休闲服装品牌
2019/07/12 全球购物
罗马尼亚购物网站:Vivantis.ro
2019/07/20 全球购物
Chain Reaction Cycles俄罗斯:世界上最大的在线自行车商店
2019/08/27 全球购物
解释下列WebService名词:WSDL、SOAP、UDDI
2012/06/22 面试题
红旗方阵解说词
2014/02/12 职场文书
小学生秋游活动方案
2014/02/23 职场文书
小区文明倡议书
2014/05/16 职场文书
项目经理任命书范本
2014/06/05 职场文书
幼师大班个人总结
2015/02/13 职场文书
调任通知
2015/04/21 职场文书
五星红旗迎风飘扬观后感
2015/06/17 职场文书
2016元旦晚会主持词开场白和结束语
2015/12/04 职场文书
关于JavaScript轮播图的实现
2021/11/20 Javascript