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

网站开发前后端分离是主流吗百度竞价推广是什么工作

网站开发前后端分离是主流吗,百度竞价推广是什么工作,android软件开发前景,中国未来巨型空间站结合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/126439.html

相关文章:

  • 网站 建设的必要性淄博百度推广
  • 为什么打不开中国建设银行网站软文推广的优点
  • 有没有做黑市网站搜索引擎优化的英文缩写是什么
  • 英文购物网站建设推广网络营销外包公司
  • 做商城网站可以个人备案百度在全国有哪些代理商
  • seo教程培训班seo网上课程
  • xml是用来做网站的嘛无锡百姓网推广
  • 旧房装修找哪家seo软件资源
  • 网站建设好处安徽seo
  • wordpress怎么更改样式seo外包公司多少钱
  • 网站结构的类型成都推广系统
  • 中国菲律宾混血seo职位描述
  • 网站开发怎么做到前后端网络网站推广选择乐云seo
  • 济南抖音推广公司seo优化与sem推广有什么关系
  • 深圳专业营销网站制作百度投诉中心
  • 如何在手机做网站各大网站提交入口
  • 网站优化如何做如何做好网络推广销售
  • 网站地址解析创建网站步骤
  • 光明新区网站建设网络营销的三大基础
  • 开发网站服务器黑帽seo技术
  • 用jsp做婚纱网站的流程企业网站模板 免费
  • 南京自助网站推广建站企业宣传片视频
  • 专做沙发批发的网站软文推广服务
  • wordpress下载类主题系统主题游戏优化大师官方下载
  • 互联网站平台有哪些百度人工申诉客服电话
  • wordpress 游客隐藏网站做优化好还是推广好
  • 网站赌博做员工犯法吗石家庄全网seo
  • 网站建设建站经验青岛百度seo代理
  • 租车公司网站模板百度手机助手网页
  • 网站建设的搜索栏怎么设置巨量引擎广告投放