模拟Vue.js响应式原理

整体分析

  • Vue基本结构
  • 打印Vue实例观察
  • 整体结构
    请添加图片描述

Vue

把data中的成员注入到Vue实例,并且把data中的成员转成gettter、setter

  • 功能
    • 负责结构初始化的参数(选项)
    • 负责把data中的属性注入到Vue实例,转化成getter、setter
    • 负责调用observer监听data中的所有属性的变化
    • 负责调用compiler解析指令、插值表达式
  • 结构
    • $options
    • $el
    • $data
    • _proxyData()

Observer

能够对数据对象的所有属性进行监听,如有变动可拿到最新值并通知Dep

  • 功能
    • 负责把data选项中的属性转换成响应式数据
    • data中的某个属性也是对象,把该属性转化成响应式数据
    • 数据变化发送通知
  • 结构
    • walk(data)
    • defineReactive(data, key, value)

Compiler

  • 功能
    • 负责编译模板,解析指令、差值表达式
    • 负责页面的首次渲染
    • 当数据变化后重新渲染视图
  • 结构
    • el
    • vm
    • compile(el)
    • compileElement(node)
    • compileText(node)
    • isDirective(attrName)
    • isTextNode(node)
    • isElementNode(node)

Dep(Dependency)

在这里插入图片描述

  • 功能
    • 收集依赖,添加观察者(watcher)
    • 通知所有观察者
  • 结构
    • subs
    • addSub(sub)
    • notify()

Watcher

在这里插入图片描述

  • 功能
    • 当数据变化触发依赖,dep通知所有的Watcher实例更新视图
    • 自身实例化的时候往dep对象中添加自己
  • 结构
    • vm
    • key
    • cb
    • oldValue
    • update()

总结

  • 问题

    • 给属性重新赋值成对象,是否是响应式的?是

    • 给Vue实例新增一个成员是否是响应式的?不是

      对于已经创建的实例,Vue 不允许动态添加根级别的响应式 property。但是,可以使用 Vue.set(object, propertyName, value) 方法向嵌套对象添加响应式 property

  • 通过下图回顾整体流程

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值