Vue原理分析总结

vue源码分析总结

MVVM框架基本实现原理

  • 数据代理
  • 模板解析
  • 数据绑定

相关函数:

  1. 将伪数组转为真数组: [].slice.call(arr)
  2. node.nodeType: 得到结点类型(document, element, attribute, text)
  3. Object.defineProperty(obj, propertyName, props): 给对象添加属性
  4. Object.keys(obj): 得到对象自身可枚举属性组成的数组 (IE8不支持)
  5. obj.hasOwnProperty(prop): 判断prop是否是obj的自身属性
  6. DocumentFragment: 文档碎片(高效批量更新多个结点) 内存中保存nelement的容器对象

数据代理:

  1. 通过一个对象代理另一个对象来操作此对象的数据
  2. Vue数据代理: 通过vm对象来代理data对象中所有属性的操作(get/set)
  3. 用到的是准备中的34特性

模板解析(编译):

基本流程:

  1. el的所有子结点取出, 添加到一个新建的文档fragment对象中
  2. fragment中所有层次的子结点再内存中递归进行编译解析处理
  3. 将解析处理后的元素塞回页面
  4. 用到特性61

大括号表达式解析

  1. 根据正则对象得到匹配出的表达式字符串: 子匹配/RegExp.$1
  2. data中取出表达式对应的属性值
  3. 将属性值设置为文本结点的textContent

事件指令解析:

  1. 从指令中取出事件名
  2. 根据指令的值从methods中得到对应的事件处理函数对象
  3. 给当前结点绑定指定事件名和回调函数的dom事件监听
  4. 指令解析完后,移除指令属性

一般指令解析:

  1. 得到指令名和智力高表达式
  2. data中根据表达式得到对应的值
  3. 根据指令名确定需要操作元素结点的什么属性
  4. 将得到的表达式的值设置到对应的属性上
  5. 移除元素的指令属性

数据绑定:

  1. 利用数据劫持来实现数据绑定的效果.
  2. 通过defineProperty()来监视data中所有属性(任意层次,递归实现)数据的变化,一旦变化Dep就发出通知更新界面
  3. 用到34特性

observe(data, this)

  1. 被观察者必须是一个对象
  2. 实现数据劫持
  3. 遍历所有数据,创建Dep
  4. data重新定义属性,添加set/get方法
  5. 建立DepWacter之间关系
  6. 监听新值变化,Dep发出订阅通知,遍历所有相关wacter进行更新
  7. wacter调用回调函数更新界面

wacter(data)和Dep

  1. compile编译解析表达式期间创建wacter监视,每一个表达式就对应一个监视器
  2. Dep: 初始化时给data的属性进行数据劫持时创建,与data中的属性一一对应
  3. Depwacter之间的关系是多对多

双向数据绑定:

  1. 双向数据绑定是建立在单项数据绑定的基础之上
  2. 在解析v-model指令时,给当前元素添加input的监听
  3. 当input等value值发生变化时,将最新的值赋值给当前表达式所对应的data属性,从而更新页面

MVVM关系视图

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Vue2和Vue3的响应式原理有所不同。 在Vue2中,响应式是通过Object.defineProperty来实现的。当一个对象被传入Vue的观察者系统中时,Vue会遍历对象的每个属性,并使用Object.defineProperty将它们转换为getter和setter。当属性被访问或修改时,Vue会通知相关的观察者进行更新。 而在Vue3中,响应式是通过Proxy对象来实现的。Proxy是ES6中的一个内置构造函数,可以拦截并代理对目标对象的操作。在Vue3中,当一个对象被传入Vue的观察者系统中时,Vue会使用Proxy对对象进行代理。当属性被访问或修改时,Proxy会拦截这些操作,并通知相关的观察者进行更新。 总结起来,Vue2使用Object.defineProperty来实现响应式,而Vue3使用Proxy来实现响应式。这两种实现方式都能实现相同的效果,但Vue3的Proxy机制更加灵活和高效,对于大型应用和性能要求较高的场景来说,Vue3的响应式系统更加优秀。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue2 和 Vue3响应式原理的区别](https://blog.csdn.net/qq_43835345/article/details/125378237)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [详细分析vue响应式原理](https://download.csdn.net/download/weixin_38752830/12925418)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [ruoyi-vue-pro yudao 项目报表设计器 积木报表模块启用及相关SQL脚本](https://download.csdn.net/download/zengwenbo225566/88234865)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值