1.双向数据绑定的原理:属性拦截

2.属性拦截实现方式 : 使用Object.defineProperty()将对象的属性变成访问器属性。

3.如果对访问器属性不是很了解的小伙伴可以看一下这一篇文章哈:JS数据属性与访问器属性

4.本小节主要模拟vue的双向数据绑定原理,由于vue渲染数据使用了虚拟DOM技术,比较复杂,所以这里笔者就稍微了写简单一些哈。主要的目的是为了双向绑定的原理,而不是虚拟DOM渲染的原理。

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head><body><div id="app"><input type="text" placeholder="请输入文本" v-model="{{ msg }}"><br>您输入的文本是:<p>{{ msg }}</p>  <br><button onclick="app.msg = '我是黑马保健坤'">点我修改文本</button></div><script>function hmVue(obj) {//querySelector默认只会获取满足选择器条件的第一个元素// vue的挂载点el只能选中一个元素的原理this.el = document.querySelector(obj.el);// vue会将data对象中的成员平铺到vue实例中this.msg = obj.data.msg;this._msg = this.msg;/* 双向数据绑定的原理 : 属性拦截*///1.监听data  -> 开始监听data中的数据变化Object.defineProperty(this, "msg", {get: function () {console.log('有人想要读取我的值');return this._msg;},set: function (newValue) {console.log('外部赋值时的传参' + newValue);this._msg = newValue;// data值变化 : 修改input的value值input.value = newValue;// data值变化 : 渲染到页面var p = document.querySelector('p');p.innerText = newValue;}});//2.监听input -> 开始监听input表单的value值变化//利用属性选择器,选中使用了 v-model指令的表单元素var input = document.querySelector(`${obj.el} [v-model]`);//监听输入框value值变化(这里我直接使用了oninput事件),其实使用属性拦截不仅可以让表单元素实现双向数据绑定,还可以让页面任何元素都能实现双向数据绑定input.oninput = function(){// input值变化 , 修改data中的数据this.msg = input.value;}.bind(this);};var app = new hmVue({el: '#app',data: {msg: ''}});</script>
</body></html>

JS双向数据绑定的原理介绍相关推荐

  1. vue双向数据绑定的原理

    有关双向数据绑定的原理 最近两次面试的时候,被问到了vue中双向数据绑定的原理,因为初学不精,只是使用而没有深入研究,所以答不出来.之后就在网上查找了别人写的博客,学习一下. 下面是博客园一篇博客,以 ...

  2. vue的双向数据绑定的原理

    VUE实现双向数据绑定的原理就是利用了 Object.defineProperty() 这个方法重新定义了对象获取属性值(get)和设置属性值(set)的操作来实现的. 代码演示:defineProp ...

  3. 原生js双向数据绑定

    前面我们介绍过存储器属性(重新认识javascript对象(一)--对象及其属性),以及如何用Object.defineProperty()定义一个存储器属性,今天我们介绍如何用Object.defi ...

  4. 10行代码-原生JS双向数据绑定演示

    很简单的10行代码就可以实现输入框与页面实时显示的绑定,也就是百度一下一大堆的所谓的双向数据绑定,完全没有必要搞那么长 function test() {const container = docum ...

  5. 学习vue的双向数据绑定的原理

    1. vue数据双向绑定的原理. 2. 实现简单版vue的过程,主要实现{{}}.v-model和事件指令的功能. vue数据双向绑定原理 vue数据双向绑定是通过数据劫持结合发布者-订阅者模式的方式 ...

  6. 深入理解vue.js双向绑定的实现原理

    vue.js是MVVM(模型到视图和视图到模型)结构的,同类的还有AngularJs:至于MVC.MVP.MVVM的比较网上已经有很多了,这样不再重复.这篇文章将给大家深入的介绍vue.js双向绑定的 ...

  7. “别具一格”的vue双向数据绑定原理

    背景和一点点看法 见网上许多文章讲vue双向数据绑定一开口就大谈 Object.defineProperty 和 proxy.其实不然.这是vue中响应式的"基石". vue 中有 ...

  8. 双向数据绑定原理(三种实现方式)

    <!DOCTYPE html> <html><head><meta charset="UTF-8"><title>双向数 ...

  9. 【Vue】双向数据绑定原理 vue2.0 与 vue3.0

    目录 一.什么是双向数据绑定? 二.双向数据绑定原理 vue2.0 三.Vue 3.0使用ES6的新特性porxy 四.思考 一.什么是双向数据绑定? vue是一个mvvm框架,即数据双向绑定,即当数 ...

最新文章

  1. tungsten开机启动及进程开启停止
  2. 2016/3/16 高级查询 ①连接查询 ②联合查询 ③子查询 无关 相关
  3. ActiveMQ作为Logstash的消息代理
  4. Halcon 4点单标相机外参
  5. android第三方视频播放加密,android 视频 加密/解密(使用AES)
  6. H3CSE培训阶段1
  7. UG NX重用库汉化版本
  8. 【微信授权登录失败】Universal Link check failed 第5步问题解决(授权二次确认弹框问题)
  9. 数学建模-线性规划模型基本原理与编程实现
  10. vue+elementUI 怎么上传图片至阿里云
  11. 如何成为一个优秀的测试工程师
  12. 开发的页面卡顿、慢?一文教你如何进行页面性能优化
  13. css+js 实现炫酷的魔方旋转
  14. mysql语句将两列合并一列_mysql – SQL选择将两列合并为一列
  15. Android 友盟推送收不到
  16. 10.发布者Publisher的编程实现
  17. Spring Security + JWT实现权限管理
  18. Hello Riak
  19. OllyDbg分析crackme-AcidBurn
  20. (知乎)你是如何变的自律的

热门文章

  1. 用c++来开发php的底层模块|用c++来开发apache模块,Apache模块开发实例(2)
  2. 织梦html编辑器功能在哪,织梦dede自带编辑器替换百度ueditor编辑器
  3. mysql逗号分隔正则查询_正则表达式在逗号分隔的列表中查找字符串和下一个字符-MySQL?...
  4. VMware搭建Android x86
  5. 转载【IDEA】向IntelliJ IDEA创建的项目导入Jar包的两种方式
  6. 北京内推 | 地平线视觉算法团队招聘视觉算法实习生
  7. ​超越Transformer!AAAI 2021最佳论文:高效长序列预测模型
  8. 我如何一分钱没花学完AI课程,入职新浪算法工程师
  9. 知乎高赞回答:是否有必要系统学习概率图模型?
  10. 直播预告 | 基于多智能体交流游戏的零资源机器翻译