<!DOCTYPE html>
<html>
<head><title></title>
</head>
<body><div id="app"><input type="text" name="" v-model='num'><button v-click='addNum'>点击</button><h1 v-bind='num'></h1></div>
</body>
</html>
<script type="text/javascript">function MyVue(options) {this._init(options);}MyVue.prototype._init = function(options) {this.$options = options;this.$data = options.data;this.$el = document.querySelector(options.el);this.$methods = options.methods;this._binding = {}; /*** _binding保存着model与view的映射关系,也就是我们前面定义的Watcher的实例。* 当model改变时,我们会触发其中的指令类更新,保证view也能实时更新*/this._obverse(this.$data);this._compile(this.$el);};MyVue.prototype._obverse = function (obj) {var value;for(var i in obj){if(obj.hasOwnProperty(i)){value = obj[i];this._binding[i] = {_directives:[]}var binding = this._binding[i];if(typeof value === 'object'){this._obverse(value);}Object.defineProperty(this.$data,i,{enumerable:true,configurable:true,get:function () {console.log("获取值"+value);return value;},set:function (newVal) {console.log("设置值"+value);if(value !== newVal){value = newVal;binding._directives.forEach(function (item) {item.update();})}}})}}}MyVue.prototype._compile = function (root) {var _this = this;var nodes = root.children;for(var n = 0;n<nodes.length;n++){(function (node) {if(node.children.length !== 0){_this._compile(node);}if(node.hasAttribute('v-click')){var attrVal = node.getAttribute('v-click');node.addEventListener('click',(function () {return _this.$methods[attrVal].bind(_this.$data);})())}if(node.hasAttribute('v-bind')){var attrVal = node.getAttribute('v-bind');_this._binding[attrVal]._directives.push(new Watcher('text',node,_this,attrVal,'innerHTML'));}if(node.hasAttribute('v-model') && (node.tagName === 'INPUT' || node.tagName === 'TEXTAREA')){var attrVal = node.getAttribute('v-model');node.addEventListener('input',(function (key) {_this._binding[attrVal]._directives.push(new Watcher('input',node,_this,attrVal,'value'));return function () {_this.$data[attrVal] = node.value;}})(n));}})(nodes[n])}}function Watcher(name,el,vm,exp,attr) {this.name = name; //指令的名称this.el = el; //指令对应的节点this.vm = vm; //指令所属的vm实例this.exp = exp; // 指令对应的值this.attr = attr; //指令所需要的改变的属性this.update();}Watcher.prototype.update = function () {this.el[this.attr] = this.vm.$data[this.exp];}var app = new MyVue({el:'#app',data:{num:0},methods:{addNum:function () {console.log('num');this.num++;}}});
</script>复制代码

分享:你会写一个vue的双向数据绑定吗?相关推荐

  1. 面试题:你能写一个Vue的双向数据绑定吗?

    在目前的前端面试中,vue的双向数据绑定已经成为了一个非常容易考到的点,即使不能当场写出来,至少也要能说出原理.本篇文章中我将会仿照vue写一个双向数据绑定的实例,名字就叫myVue吧.结合注释,希望 ...

  2. 面试题:你能写一个 Vue 的双向数据绑定吗?

    作者:呆头呆脑丶 segmentfault.com/a/1190000014274840 在目前的前端面试中,vue的双向数据绑定已经成为了一个非常容易考到的点,即使不能当场写出来,至少也要能说出原理 ...

  3. 写一个Vue的双向数据绑定

    原文 https://segmentfault.com/a/1190000014274840 在目前的前端面试中,vue的双向数据绑定已经成为了一个非常容易考到的点,即使不能当场写出来,至少也要能说出 ...

  4. 你能写一个 Vue 的双向数据绑定吗?

    在目前的前端面试中,vue的双向数据绑定已经成为了一个非常容易考到的点,即使不能当场写出来,至少也要能说出原理.本篇文章中我将会仿照vue写一个双向数据绑定的实例,名字就叫myVue吧.结合注释,希望 ...

  5. 手写Vue 的双向数据绑定

    在目前的前端面试中,vue的双向数据绑定已经成为了一个非常容易考到的点,即使不能当场写出来,至少也要能说出原理. 本篇文章中我将会仿照vue写一个双向数据绑定的实例,名字就叫myVue吧.结合注释,希 ...

  6. Vue v-model双向数据绑定和一个简单的整数计算器

    一.v-model双向数据绑定 方法 v-bind - 单向数据绑定(从M到V) v-model - 双向数据绑定 例子 <input type="text" v-bind: ...

  7. 【Vue的双向数据绑定原理】

    Vue的双向数据绑定原理 先说面试答案: 1. 什么是setter.getter 2. 什么是Object.defineProperty() ? 先简单的实现一个js的双向数据绑定来熟悉一下`Obje ...

  8. 深入了解Vue的双向数据绑定

    前言 在目前的前端面试中,vue的双向数据绑定已经成为了一个非常容易考到的点,即使不能当场写出来,至少也要能说出原理.本篇文章中我将会仿照vue写一个双向数据绑定的实例,名字就叫myVue吧.结合注释 ...

  9. Vue 的双向数据绑定原理解析

    在目前的前端面试中,vue的双向数据绑定已经成为了一个非常容易考到的点,即使不能当场写出来,至少也要能说出原理.本篇文章中我将会仿照vue写一个双向数据绑定的实例,名字就叫myVue吧.结合注释,希望 ...

最新文章

  1. JAVA中文字符串编码--GBK转UTF-8
  2. mysql锁等待问题
  3. 2020-12-03 python 字典 key 和value 互换
  4. 分布式事务解决方案——柔性事务与服务模式
  5. sdut 最少拦截系统
  6. linux gpt分区看不到,Linux无法看到我的任何分区 – 备份GPT表不在磁盘的末尾
  7. python语言编写一个生成九宫格图片的代码_python简单实现9宫格图片实例
  8. Js操作Select大全(取值、设置选中)
  9. Makefile初步理解
  10. Android-第三天
  11. Markdown(六)——表格合并单元格增加标题
  12. smartplant license manager issue
  13. hbase占用内存过高_为什么不建议在 HBase 中使用过多的列族
  14. BASE16、BASE32、BASE64编码特征及正则匹配
  15. 制作u盘winpe启动盘_如何制作U盘启动盘
  16. Java学习lesson 10
  17. 《使用Python进行自然语言处理》学习笔记六
  18. 【今日CV 计算机视觉论文速览 第99期】Fri, 12 Apr 2019
  19. 杰理之设置恒流充电电流【篇】
  20. 坚持一年背英语单词的总结

热门文章

  1. “升级版后浪”刷屏:B站别再搬砖砸自己脚了!
  2. WEB应用防火墙是什么,数据库被篡改了怎么办,数据泄漏了用什么防
  3. java hashmap is遍历_关于内存:在Java(或Scala)中遍历HashMap的HashMap
  4. 高效遍历HashMap的5种方式
  5. 关于计算机游戏的电视,电视怎么玩电脑游戏,有什么好用的方法
  6. 绝地求生 无限复活服务器,绝地求生无限复活模式怎么玩/攻略/规则 绝地求生无限复活新手教程攻略一览...
  7. 互联网寒冬真的不是贩卖焦虑,就业形势越发艰难。
  8. 虚拟世界中的博物馆:Web3 技术如何帮助历史遗址
  9. 智能客服机器人背后是思考与实践
  10. 利用CSS实现爱心跳动案例--浪漫爱心表白