github.com/logictuLuoq…

简单介绍一下MVVM

MVVM是Model-View-ViewModel的简写 MVVM 就是将其中的View 的状态和行为抽象化,让我们将视图 UI 和业务逻辑分开。当然这些事 ViewModel 已经帮我们做了

还是听不懂 简单一点

你控制 Model(数据)
写vue 全在控制数据
View(模板)
你就理解成 你写的templeat
ViewModel这东西叫vue

手写双向数据绑定是什么东西

我们还记得react是这么操作的吗

setData()累吧

vue采用的是双向数据绑定 是什么呢 this.data简单吧

我们看里面的原理

我写完了双向数据绑定 应为中文名的原因取名为mvvm

跑起来项目

    git clone https://github.com/logictuLuoqi/Practicecd MVVMnpm install serveserve .
复制代码

就跑起来了 为什么要用 serve 是这样的本次代码采用 ES6的模块化

我写代码的过程

首先写调用

    <div id="app"><input type="text" id="a" v-model="text">{{ text }}</div>
复制代码

之后可以参照文章的 type ES6模块化

去写 MVVM的js

    new Vue({el: 'app',data: {text: 'Hello Vue!'}})
复制代码

入口看完后我们来看方法

    observer(data, this);const dom = new Compile(document.querySelector(`#${el}`), this);
复制代码

针对于这两个点做一下解释

observer

我去这个名字也知道做什么了 双向数据绑定 这里采用 defineProperty

github.com/logictuLuoq…

帮助理解observer中的defineProperty

    get() {if (Dep.target) {dep.addSub(Dep.target);}return val;},set(newVal) {if (newVal === val) return;val = newVal;dep.notify();},
复制代码

这里的 Dep.target后续介绍

dep.notify();后续解释

Compile

我在这里写的是createDocumentFragment 来代替虚拟dom这东西后面介绍虚拟dom

    const frag = document.createDocumentFragment()return frag;
复制代码

写正则 匹配 {{里面的全部}}

    const reg = /\{\{(.*)\}\}/;
复制代码

来查找到DOM节点上有这个属性的

    if(node.nodeType === 3){if(reg.test(node.nodeValue)){let name = RegExp.$1;name = name.trim();new Watcher(vm, node, name, 'nodeValue');}}
复制代码

寻找input

    for(let i = 0; i < attributes.length; i++){if(attributes[i].nodeName == 'v-model'){const { nodeValue } = attributes[i];node.addEventListener('input', function(e){vm[nodeValue] = e.target.value;})new Watcher(vm, node, nodeValue, 'value');}}
复制代码

Watcher

    export default function Warcher(vm, node, name, type) {Dep.target = this;this.name = name;this.node = node;this.vm = vm;this.type = type;this.update();Dep.target = null;}
复制代码

Dep.target 你们发现了什么

往下看

    Warcher.prototype.update = function () {this.get();const batcher = new Batcher();batcher.push(this)};Warcher.prototype.cb = function () {this.node[this.type] = this.vm.text;};Warcher.prototype.get = function ()  {this.node[this.type] = this.vm[this.name];};
复制代码

是不是丢失的都找到了呀

Dep.target

update()

那么Dep是什么鬼

Dep

    export default function Dep(){this.subs = [];}Dep.prototype.addSub = function (sub) {this.subs.push(sub);}Dep.prototype.notify = function () {this.subs.forEach((sub) => {sub.update();});}复制代码

就是这么说 把

    export default function Dep(){this.subs = [Dep.target,Dep.target,Dep.target];}
复制代码
    Dep.prototype.notify = function () {this.subs.forEach((sub) => {sub.update(); ==== Dep.target.update();});}
复制代码

这样结合上面的双向数据绑定解释

手写简单的双向数据绑定相关推荐

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

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

  2. 手写简单的HashMap(jdk1.7)

    手写简单的HashMap(jdk1.7) public class MyHashMap<K, V> { //创建一个节点数组 private Entry1<K, V>[] ta ...

  3. 使用代理模式手写简单的数据库连接池

    使用代理模式手写简单的数据库连接池 JDBC直连数据库 思考 改造 ConnectionProxy ConnectionPool ProxyMain 运行结果 代理模式 与装饰器的区别 JDBC直连数 ...

  4. Dubbo——手写简单版Dubbo框架

    摘要 本博文将详细的介绍的一个手写简单版本的dubbo的实现. 项目架构原理图 项目源码实现 https://github.com/2462612540/DubboPrinciple/tree/mas ...

  5. 理解 call、apply、bind 原理,手写简单的 call、apply、bind 方法

    理解 call.apply.bind 原理,手写简单的 call.apply.bind 方法 call 原理及实现 MDN定义:call()方法使用给定的 this 值和单独提供的参数调用函数. 用自 ...

  6. 手写简单版 Promise

    Promise作为ES6新增的函数,帮助我们解决了回调地狱的难题,让我们的异步代码可以更加清晰简洁,作为一名前端程序员,手写简单版Promise应该是必备的技能.接下来不多说,直接上代码了. clas ...

  7. 数字识别实例两种实现方式(tensorflow2.x):1.调用高级API 2.手写简单神经网络 3.手写深度神经网络(DNN)

    MNIST手写数字数据库的训练集为60,000个示例,而测试集为10,000个示例. 一共4个文件,训练集.训练集标签.测试集.测试集标签,这些数据直接可以用mnist = tf.keras.data ...

  8. JavaScript实现简单的双向数据绑定(Ember、Angular、Vue)

    tip:有问题或者需要大厂内推的+我脉脉哦:丛培森 ٩( 'ω' )و [本文源址:http://blog.csdn.net/q1056843325/article/details/72999948 ...

  9. [转]js实现简单的双向数据绑定

    转自:http://www.see-source.com/blog/300000038/444 双向数据绑定指的就是,绑定对象属性的改变到用户界面的变化的能力,反之亦然.换种说法,如果我们有一个use ...

最新文章

  1. 检查字典中是否已存在给定键
  2. python综合程序设计-Python程序设计实验五:综合运用三种基本结构进行程序设计...
  3. pytorch 正向与反向传播的过程 获取模型的梯度(gradient),并绘制梯度的直方图
  4. php搭建的网站空白,使用phpstudy搭建dedecms网站后台页面空白解决方法
  5. 十分钟上手 ES 2020 新特性
  6. 【AI视野·今日Robot 机器人论文速览 第十一期】Mon, 21 Jun 2021
  7. 百面机器学习 #3 经典算法:02 逻辑回归
  8. 读书:《从零到百亿-Facebook创业故事》
  9. 一夜回到解放前,无数可依情况下如何做好风险控制
  10. Nacos教程_2 讲解
  11. Struts2 初探
  12. 图像空域增强:灰度映射法
  13. 书信用语“商祺”是的意思
  14. 数组(Java基础内容)
  15. java中 什么意思?比如130
  16. 「图与推荐指南针」: 顶级学者/研究组有哪些?
  17. 电脑声卡或者耳机接口坏了怎么办
  18. 二级分销跟差价收益有区别吗?
  19. Python实现一键生成微信好友头像墙
  20. 352记--扬哥本纪

热门文章

  1. 01:谁考了第k名 个人博客:doubleq.win
  2. Android开发之dp转像素,像素转换为dp工具类,详细代码,带有源文件下载地址。...
  3. MySQL流程控制函数
  4. Oracle 12C -- 扩展varchar2、nvarchar2、和raw数据类型的大小限制
  5. GNU make manual 翻译( 一百二十一)
  6. GUID和自增ID的比较_delete
  7. 多种树,兔子才会撞上来
  8. SQL Server误区30日谈-Day21-数据损坏可以通过重启SQL Server来修复
  9. VUE中使用sass
  10. LintCode刷题——Largest Divisible Subset