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 相关文章推荐
扩展String功能方法
Sep 22 Javascript
jQuery结合Json提交数据到Webservice,并接收从Webservice返回的Json数据
Feb 18 Javascript
jQuery实现带延迟效果的滑动菜单代码
Sep 02 Javascript
浅谈js图片前端预览之filereader和window.URL.createObjectURL
Jun 30 Javascript
js实时获取窗口大小变化的实例代码
Nov 18 Javascript
js手机号4位显示空格,银行卡每4位显示空格效果
Mar 23 Javascript
vue component组件使用方法详解
Jul 14 Javascript
VUE简单的定时器实时刷新的实现方法
Jan 20 Javascript
vue读取本地的excel文件并显示在网页上方法示例
May 29 Javascript
解决vue自定义全局消息框组件问题
Nov 22 Javascript
如何基于layui的laytpl实现数据绑定的示例代码
Apr 10 Javascript
vue中配置scss全局变量的步骤
Dec 28 Vue.js
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
神族 Protoss 历史背景
2020/03/14 星际争霸
40个迹象表明你还是PHP菜鸟
2008/09/29 PHP
PHP实现对站点内容外部链接的过滤方法
2014/09/10 PHP
关于 Laravel Redis 多个进程同时取队列问题详解
2017/12/25 PHP
爱恋千雪-US-AscII加密解密工具(网页加密)下载
2007/06/06 Javascript
Javascript模块模式分析
2008/05/16 Javascript
js/ajax跨越访问-jsonp的原理和实例(javascript和jquery实现代码)
2012/12/27 Javascript
js实现连续英文字符自动换行兼容ie6 ie7和firefox
2013/09/06 Javascript
在firefox和Chrome下关闭浏览器窗口无效的解决方法
2014/01/16 Javascript
jQuery拖动div、移动div、弹出层实现原理及示例
2014/04/08 Javascript
JS根据年月获得当月天数的实现代码
2014/07/03 Javascript
JavaScript中的操作符==与===介绍
2014/12/31 Javascript
JavaScript通过this变量快速找出用户选中radio按钮的方法
2015/03/23 Javascript
浅谈javascript语法和定时函数
2015/05/03 Javascript
js+canvas简单绘制圆圈的方法
2016/01/28 Javascript
详述JavaScript实现继承的几种方式(推荐)
2016/03/22 Javascript
jQuery中的AjaxSubmit使用讲解
2016/09/25 Javascript
利用yarn实现一个webpack+react种子
2016/10/25 Javascript
js实现HashTable(哈希表)的实例分析
2016/11/21 Javascript
Javascript实现页面滚动时导航智能定位
2017/05/06 Javascript
JS桶排序的简单理解与实现方法示例
2019/11/25 Javascript
详解vuejs中执行npm run dev出现页面cannot GET/问题
2020/04/26 Javascript
Python3.x版本中新的字符串格式化方法
2015/04/24 Python
Python访问纯真IP数据库脚本分享
2015/06/29 Python
Python中文竖排显示的方法
2015/07/28 Python
css3实现蒙版弹幕功能
2019/06/18 HTML / CSS
Looking4Parking美国:全球排名第一的机场停车比较品牌
2019/08/26 全球购物
如何用PHP实现邮件发送
2012/12/26 面试题
请介绍一下WSDL的文档结构
2013/03/17 面试题
管理部部长岗位职责
2013/12/05 职场文书
创先争优承诺书
2015/01/20 职场文书
商超业务员岗位职责
2015/02/13 职场文书
2015年幼儿园中班开学寄语
2015/05/27 职场文书
简历中的自我评价怎么写呢?
2019/04/30 职场文书
2019学生会干事辞职信
2019/06/27 职场文书
vue实现滑动解锁功能
2022/03/03 Vue.js