当前位置: 首页 > wzjs >正文

镇江京口区北京seo顾问服务公司

镇江京口区,北京seo顾问服务公司,网盟推广合作,公司外宣网站结合vue源码,分析vue2及vue3的数据绑定实现原理 Vue 2 数据绑定实现整体思路详细实现1. Observer 类:数据劫持2. Dep 类:依赖收集3. Watcher 类:订阅者 Vue 3 数据绑定实现整体思路详细实现1. reactive 函数:创建响应式…

结合vue源码,分析vue2及vue3的数据绑定实现原理

      • Vue 2 数据绑定实现
        • 整体思路
        • 详细实现
          • 1. `Observer` 类:数据劫持
          • 2. `Dep` 类:依赖收集
          • 3. `Watcher` 类:订阅者
      • Vue 3 数据绑定实现
        • 整体思路
        • 详细实现
          • 1. `reactive` 函数:创建响应式对象
          • 2. 依赖收集和触发更新
          • 3. `effect` 函数:副作用收集
      • 总结

Vue 2 数据绑定实现

整体思路

Vue 2 的数据绑定主要基于 Object.defineProperty() 方法来实现数据劫持,配合发布 - 订阅模式,当数据发生变化时通知视图更新。主要涉及三个核心部分:Observer 用于数据劫持、Dep 进行依赖收集、Watcher 作为订阅者接收更新通知。
在这里插入图片描述

详细实现
1. Observer 类:数据劫持
// 定义 Observer 类,用于对对象属性进行劫持
class Observer {constructor(data) {// 遍历对象属性this.walk(data);}walk(data) {if (!data || typeof data!== 'object') {return;}Object.keys(data).forEach(key => {this.defineReactive(data, key, data[key]);});}defineReactive(obj, key, val) {// 创建一个 Dep 实例用于依赖收集const dep = new Dep();// 递归处理子对象new Observer(val);Object.defineProperty(obj, key, {enumerable: true,configurable: true,get() {// 收集依赖if (Dep.target) {dep.depend();}return val;},set(newVal) {if (newVal === val) {return;}val = newVal;// 对新值进行递归处理new Observer(newVal);// 通知依赖更新dep.notify();}});}
}

Observer 类会遍历对象的所有属性,使用 Object.defineProperty() 重写属性的 gettersetter。在 getter 中收集依赖,在 setter 中通知依赖更新。

2. Dep 类:依赖收集
// Dep 类用于管理依赖
class Dep {constructor() {// 存储依赖的数组this.subs = [];}depend() {if (Dep.target) {Dep.target.addDep(this);}}addSub(sub) {this.subs.push(sub);}notify() {this.subs.forEach(sub => sub.update());}
}
Dep.target = null;

Dep 类有一个 subs 数组来存储依赖(Watcher 实例)。depend 方法用于收集依赖,notify 方法用于通知所有依赖更新。

3. Watcher 类:订阅者
// Watcher 类作为订阅者,监听数据变化
class Watcher {constructor(vm, expOrFn, cb) {this.vm = vm;this.cb = cb;this.getter = parsePath(expOrFn);this.value = this.get();}get() {Dep.target = this;const value = this.getter.call(this.vm, this.vm);Dep.target = null;return value;}addDep(dep) {dep.addSub(this);}update() {const oldValue = this.value;this.value = this.get();this.cb.call(this.vm, this.value, oldValue);}
}function parsePath(path) {const segments = path.split('.');return function (obj) {for (let i = 0; i < segments.length; i++) {if (!obj) return;obj = obj[segments[i]];}return obj;};
}

Watcher 类在实例化时会触发 get 方法,从而触发 getter 进行依赖收集。当数据变化时,Dep 会调用 Watcherupdate 方法,update 方法会重新获取数据并调用回调函数更新视图。

Vue 3 数据绑定实现

整体思路

Vue 3 使用 ES6 的 Proxy 对象来实现数据劫持,结合 WeakMap 进行依赖收集,相比 Vue 2 更加灵活高效。核心部分包括 reactive 函数创建响应式对象、effect 函数用于副作用收集、tracktrigger 函数进行依赖收集和触发更新。

详细实现
1. reactive 函数:创建响应式对象
// reactive 函数用于创建响应式对象
function reactive(target) {const handler = {get(target, key, receiver) {// 收集依赖track(target, key);return Reflect.get(target, key, receiver);},set(target, key, value, receiver) {const oldValue = target[key];const result = Reflect.set(target, key, value, receiver);if (oldValue!== value) {// 触发更新trigger(target, key);}return result;}};return new Proxy(target, handler);
}

reactive 函数使用 Proxy 对象拦截对象的 getset 操作。在 get 操作中调用 track 进行依赖收集,在 set 操作中调用 trigger 触发更新。

2. 依赖收集和触发更新
// 用于存储对象及其依赖映射的 WeakMap
const targetMap = new WeakMap();function track(target, key) {let depsMap = targetMap.get(target);if (!depsMap) {targetMap.set(target, (depsMap = new Map()));}let dep = depsMap.get(key);if (!dep) {depsMap.set(key, (dep = new Set()));}if (activeEffect) {dep.add(activeEffect);}
}function trigger(target, key) {const depsMap = targetMap.get(target);if (!depsMap) {return;}const dep = depsMap.get(key);if (dep) {dep.forEach(effect => effect());}
}

targetMap 是一个 WeakMap,用于存储对象及其依赖映射。track 函数负责收集依赖,将 activeEffect 添加到对应的依赖集合中。trigger 函数负责触发更新,遍历依赖集合并执行其中的副作用函数。

3. effect 函数:副作用收集
let activeEffect = null;function effect(fn) {const _effect = function () {activeEffect = _effect;fn();activeEffect = null;};_effect();return _effect;
}

effect 函数用于创建副作用函数,在执行副作用函数之前将其赋值给 activeEffect,以便在 track 函数中进行依赖收集。

总结

  • Vue 2:使用 Object.defineProperty() 实现数据劫持,需要递归处理对象属性,对于新增和删除属性需要额外处理。
  • Vue 3:使用 Proxy 对象实现数据劫持,能拦截更多操作,无需递归处理,对新增和删除属性的处理更加自然,性能和灵活性更高。
http://www.dtcms.com/wzjs/292374.html

相关文章:

  • 大兴网站开发深圳网络推广团队
  • 建筑工程机械人才培训网的证书关键词排名优化价格
  • 东莞网站建设seo推广深圳招聘网络推广
  • 优秀网站建设出售搜索引擎广告
  • 武昌做网站公司电话搜索优化整站优化
  • 网站的前台后台制作网页的基本步骤
  • 网站整体设计福州专业的seo软件
  • 郴州做网站seo东莞网站建设推广公司
  • 成都网站制作网站的搜索引擎
  • 高中男女做那个视频网站北京网站seo招聘
  • wordpress怎么弄背景福州seo关键字推广
  • 最专业的微网站开发襄阳seo优化排名
  • 广西委办局网站独立建设政策seo营销培训
  • 做网批的有什么网站呢游戏推广公司靠谱吗
  • 设计软件网站幽默广告软文案例
  • 亚马逊商标备案是否必须做网站和生活爱辽宁免费下载安装
  • 网站网页怎么做今日国内新闻大事
  • 动漫网站设计报告软文推广方案
  • 在哪做网站专业google搜索排名优化
  • 做网站卖产品促销方案
  • html5网站开发案例视频网站百度权重查询
  • 怎么制作网站设计十大广告公司排名
  • 西安疫情忽然严重了外链seo推广
  • 网站根目录是什么意思潮州网络推广
  • wordpress禁止生成多个缩略图seo商城
  • 人力招聘网站建设大专网络营销专业好不好
  • 优惠购网站怎么做的企业排名优化公司
  • 网站草图怎么做童程童美少儿编程怎样收费
  • 上海 网站备案代理网站流量查询平台
  • 网站上滚动图片如何做小程序怎么开发