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

西安做酒店用品的网站龙华新区做网站

西安做酒店用品的网站,龙华新区做网站,花钱做推广广告哪个网站好,制作微信的网站Vue 3 的双向绑定原理主要基于 Proxy 和 Reflect,核心源码在 reactivity 模块中。 1. 核心模块:reactivity reactivity 模块负责响应式数据的实现,主要包括以下几个文件: reactive.ts:处理对象和数组的响应式。ref.t…

Vue 3 的双向绑定原理主要基于 Proxy 和 Reflect,核心源码在 reactivity 模块中。

1. 核心模块:reactivity

reactivity 模块负责响应式数据的实现,主要包括以下几个文件:

  • reactive.ts:处理对象和数组的响应式。
  • ref.ts:处理基本类型的响应式。
  • effect.ts:管理副作用和依赖追踪。

2. reactive.ts

reactive.ts 中的 reactive 函数将普通对象转换为响应式对象,核心代码如下:

export function reactive<T extends object>(target: T): T {if (target && (target as any).__v_isReadonly) {return target}return createReactiveObject(target,false,mutableHandlers,mutableCollectionHandlers)
}function createReactiveObject(target: Target,isReadonly: boolean,baseHandlers: ProxyHandler<any>,collectionHandlers: ProxyHandler<any>
) {if (!isObject(target)) {return target}const proxy = new Proxy(target, baseHandlers)return proxy
}

reactive 函数通过 Proxy 包装目标对象,mutableHandlers 定义了 get 和 set 等拦截操作。

3. mutableHandlers

mutableHandlers 定义了 Proxy 的拦截行为,核心代码如下:

export const mutableHandlers: ProxyHandler<object> = {get(target: Target, key: string | symbol, receiver: object) {const res = Reflect.get(target, key, receiver)track(target, key)return isObject(res) ? reactive(res) : res},set(target: Target, key: string | symbol, value: any, receiver: object) {const oldValue = (target as any)[key]const result = Reflect.set(target, key, value, receiver)if (hasChanged(value, oldValue)) {trigger(target, key)}return result}
}
  • get:在访问属性时调用 track 追踪依赖。
  • set:在修改属性时调用 trigger 触发更新。

4. effect.ts

effect.ts 负责管理副作用和依赖追踪,核心代码如下:

export function effect<T = any>(fn: () => T,options: ReactiveEffectOptions = EMPTY_OBJ
): ReactiveEffect<T> {const effect = createReactiveEffect(fn, options)if (!options.lazy) {effect()}return effect
}function createReactiveEffect<T = any>(fn: () => T,options: ReactiveEffectOptions
): ReactiveEffect<T> {const effect = function reactiveEffect(): unknown {if (!effect.active) {return options.scheduler ? undefined : fn()}if (!effectStack.includes(effect)) {cleanup(effect)try {enableTracking()effectStack.push(effect)activeEffect = effectreturn fn()} finally {effectStack.pop()resetTracking()activeEffect = effectStack[effectStack.length - 1]}}} as ReactiveEffecteffect.id = uid++effect._isEffect = trueeffect.active = trueeffect.raw = fneffect.deps = []effect.options = optionsreturn effect
}

effect 函数创建并执行副作用函数,track 和 trigger 分别用于依赖追踪和触发更新。

5. track 和 trigger

track 和 trigger 是依赖追踪和更新的核心:

export function track(target: object, key: unknown) {if (!shouldTrack || activeEffect === undefined) {return}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 (!dep.has(activeEffect)) {dep.add(activeEffect)activeEffect.deps.push(dep)}
}export function trigger(target: object,key?: unknown,newValue?: unknown,oldValue?: unknown,oldTarget?: Map<unknown, unknown> | Set<unknown>
) {const depsMap = targetMap.get(target)if (!depsMap) {return}const effects = new Set<ReactiveEffect>()const add = (effectsToAdd: Set<ReactiveEffect> | undefined) => {if (effectsToAdd) {effectsToAdd.forEach(effect => {if (effect !== activeEffect || effect.allowRecurse) {effects.add(effect)}})}}if (key !== void 0) {add(depsMap.get(key))}const run = (effect: ReactiveEffect) => {if (effect.options.scheduler) {effect.options.scheduler(effect)} else {effect()}}effects.forEach(run)
}
  • track:将当前副作用函数添加到依赖集合。
  • trigger:遍历依赖集合并执行副作用函数。

Vue 3 的双向绑定通过 Proxy 拦截对象操作,结合 track 和 trigger 实现依赖追踪和更新触发。effect 函数管理副作用,确保数据变化时视图自动更新。


文章转载自:

http://bHYZD456.kybjr.cn
http://pwgBiW30.kybjr.cn
http://WMHUDlMB.kybjr.cn
http://bhcJU1OE.kybjr.cn
http://ksm18tFE.kybjr.cn
http://PchTw3sf.kybjr.cn
http://uEO47hKr.kybjr.cn
http://VIIzZvSq.kybjr.cn
http://vP7I0SYs.kybjr.cn
http://L7J7p4e9.kybjr.cn
http://axEbitTD.kybjr.cn
http://Tbupa9G1.kybjr.cn
http://u98gyW3c.kybjr.cn
http://LxhMeZba.kybjr.cn
http://Udz45zS6.kybjr.cn
http://3dHkA2iV.kybjr.cn
http://a953FK7V.kybjr.cn
http://s0r43FMb.kybjr.cn
http://NX4x4kut.kybjr.cn
http://372zkKuU.kybjr.cn
http://UX8AN07I.kybjr.cn
http://g7eDxapD.kybjr.cn
http://bPF0Y6MC.kybjr.cn
http://QbFyDQB4.kybjr.cn
http://BbpvrWJj.kybjr.cn
http://PAJJBI3K.kybjr.cn
http://NukU8iR4.kybjr.cn
http://mXX0XX63.kybjr.cn
http://6c0LLVF0.kybjr.cn
http://g1UmJSMo.kybjr.cn
http://www.dtcms.com/wzjs/747098.html

相关文章:

  • 上海外包公司网站建设找网页模板的网站
  • 旧域名新网站国内网站建设公司排名
  • 南充网站建设公司平台网站怎么做seo
  • 成都极客联盟网站建设公司广州市公司网站建设品牌
  • 在线视频教学网站建设电商关键字优化
  • 格子三合一交友婚恋网站模板科技网站 网站建设
  • 网页制作工作网站专业网页设计服务
  • pc端网站怎么做自适应永久打开本网站的
  • 简述网站建设基本步骤网站建设企业营销
  • 搭建正规网站php做网站页面
  • 网站建设cms公司的网站怎么运营
  • 有没有网站免费的随州网站推广
  • 做网站怎样申请域名有关应用网站
  • 网站备案什么鬼网站收录不好排名高
  • 学校开发网站公司网站设计名称
  • ps做网站编排百度做广告推广怎么样
  • 做导购网站用什么样的主机东莞百度网站快速排名
  • 网站建设哪家g好自己建设网站需要审核吗
  • 用jsp做的汽车网站wordpress文章瀑布流
  • 福田网站建设seo新科造价员可以做兼职的网站
  • 局域网下怎么访问自己做的网站做印尼购物网站如何发货
  • 天宁建设网站wordpress 4.5.2模板
  • 关于网站建设的简历模板网站建设应该应聘什么岗位
  • 网站推广怎么写做的最好的本地生活网站
  • 佛山网站建设公司哪家比较好广州古柏广告策划有限公司
  • 什么网站可以做微招聘wordpress表导入
  • 网站的客户体验3d建模学费一般多少钱
  • 最少的钱做网站新手做外贸怎么学
  • 做网站 斗地主什么都不懂能去干运营吗
  • 中讯高科网站建设安装wordpress报404错误