zoukankan      html  css  js  c++  java
  • vue双向数据绑定原理

    vue利用“发布者-订阅者模式”和数据劫持实现双向数据绑定。

    发布者

    • 新建一个订阅者数组
    • 遍历绑定数据的所有子属性,利用Object.defineProperty()对属性进行get、set的改写。
    • 在get方法中,每当调用get,调用者就是订阅者,就添加这个订阅者到订阅者数组 -- addSub(dep.target)。并将数据返回。
    • 在set方法中,调用订阅者数组的notify方法通知每一个订阅者。并更新model中的属性。

    订阅者存储--dep

    • 如果一个个找到订阅者调用update方法,会很麻烦,所以将订阅者存储到一个数组中。
    • addSub方法,当触发发布者的get方法,就会触发addSub方法,将订阅者添加到订阅者数组中
    • notify方法,当触发发布者的set方法时,就会触发此方法,遍历所有订阅者,调用它们的update方法。

    订阅者--Watcher

    • update方法:调用run方法
    • run方法:调用get方法,获取新值,更新值
    • get方法:将订阅者数组的target指向自己,dep.target = this。设置value,触发发布者的get方法,就会将此订阅者绑定到订阅者数组中。将target置空,返回value

    所以:当数据更新时,触发发布者的set方法 --> 触发订阅者数组的notify方法 --> 触发每个订阅者的update方法 --> 触发run方法 --> 触发订阅者get方法

    compile

    • 将所有节点转换为文档碎片,以便更新后同时添加到html中,减少回流此时
    • 遍历文档碎片,如果是元素节点,遍历其属性,找到绑定数据的属性,分类处理
    • 如果是文档属性,并且使用{{}}绑定数据,更新其值
    • 最后将更新后的文档碎片添加到原根节点中
  • 相关阅读:
    【topcoder SRM 702 DIV 2 250】TestTaking
    【24.67%】【codeforces 551C】 GukiZ hates Boxes
    【TP SRM 703 div2 500】 GCDGraph
    【TP SRM 703 div2 250】AlternatingString
    【35.02%】【codeforces 734A】Vladik and flights
    Android总结篇系列:Android Service
    java之常用正则表达式
    一种软件定义的固态盘融合存储方法
    MongoDB常用语句
    编程界十大顶级IDE
  • 原文地址:https://www.cnblogs.com/ashen1999/p/12818540.html
Copyright © 2011-2022 走看看