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焦点图切换,上下翻转
May 12 Javascript
JavaScript高级程序设计 读书笔记之十一 内置对象Global
Mar 07 Javascript
jquery的ajaxSubmit()异步上传图片并保存表单数据演示代码
Jun 04 Javascript
Jquery1.9.1源码分析系列(十五)动画处理之外篇
Dec 04 Javascript
JS中Eval解析JSON字符串的一个小问题
Feb 21 Javascript
基于Bootstrap的网页设计实例
Mar 01 Javascript
理解Angular的providers给Http添加默认headers
Jul 04 Javascript
JavaScript解析任意形式的json树型结构展示
Jul 23 Javascript
Vue下的国际化处理方法
Dec 18 Javascript
ElementUI多个子组件表单的校验管理实现
Nov 07 Javascript
js实现图片上传到服务器和回显
Jan 19 Javascript
Vue 解决在element中使用$notify在提示信息中换行问题
Nov 11 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
header中Content-Disposition的作用与使用方法
2012/06/13 PHP
php读取文件内容的几种方法详解
2013/06/26 PHP
基于PHP生成简单的验证码
2016/06/01 PHP
PHP数据库编程之MySQL优化策略概述
2017/08/16 PHP
Ajax中的JSON格式与php传输过程全面解析
2017/11/14 PHP
php微信公众号开发之校园图书馆
2018/10/20 PHP
php反射学习之依赖注入示例
2019/06/14 PHP
Laravel 自动生成验证的实例讲解:login / logout
2019/10/14 PHP
tp5框架前台无限极导航菜单类实现方法分析
2020/03/29 PHP
jquery ui dialog里调用datepicker的问题
2009/08/06 Javascript
基于jquery的滚动新闻列表
2010/06/19 Javascript
封装了一个支持匿名函数的Javascript事件监听器
2014/06/05 Javascript
node.js中的fs.chmod方法使用说明
2014/12/18 Javascript
更高效的使用JQuery 这里总结了8个小技巧
2016/04/13 Javascript
jQuery验证表单格式的使用方法
2017/01/10 Javascript
ES6学习之变量的两种命名方法示例
2017/07/18 Javascript
Node使用Sequlize连接Mysql报错:Access denied for user ‘xxx’@‘localhost’
2018/01/03 Javascript
vue2.0学习之axios的封装与vuex介绍
2018/05/28 Javascript
在Vue组件中获取全局的点击事件方法
2018/09/06 Javascript
ckeditor一键排版功能实现方法分析
2020/02/06 Javascript
vue实现购物车的监听
2020/04/20 Javascript
JavaScript进阶(二)词法作用域与作用域链实例分析
2020/05/09 Javascript
vue基础知识--axios合并请求和slot
2020/06/04 Javascript
[01:23:59]2018DOTA2亚洲邀请赛 4.1 小组赛 B组 VP vs Secret
2018/04/03 DOTA
python 远程统计文件代码分享
2015/05/14 Python
Python爬虫包BeautifulSoup实例(三)
2018/06/17 Python
python导入模块交叉引用的方法
2019/01/19 Python
python在地图上画比例的实例详解
2020/11/13 Python
德国隐形眼镜店:LuckyLens
2018/07/29 全球购物
英国家喻户晓的家居商店:The Range
2019/03/25 全球购物
中学生校园广播稿
2014/01/16 职场文书
物流管理专业求职信
2014/05/29 职场文书
小学班主任培训方案
2014/06/04 职场文书
高中社区服务活动报告
2015/02/05 职场文书
幼师自荐信范文(2016推荐篇)
2016/01/28 职场文书
深入理解pytorch库的dockerfile
2022/06/10 Python