Vue3源码梳理:ref的响应性核心实现

【vue3源码】九、ref源码解析 本文主要介绍vue3中ref的实现。 阅读详情

阅读源码原则

  • 简化和调试,掌握核心流程
  • 不被过多细节束缚,只专注于主线

探究目的

  • ref 如何进行实现的
  • ref 简单数据类型的响应性是如何实现的
  • ref 类型的数据,必须通过 .value 访问,为何使用这种API

Debug Ref 源码

  • 先编写一个测试程序,用于debug

    <script src='../../dist/vue.global.js'></script>
    <body>
      <div id='app'>
      </div>
    </body>
    
    <script>
      const { ref, effect } = Vue
      // console.log(reactive)
      const obj = ref({
        name: '张三'
      })
      // console.log(obj.name) // 触发getter
      // obj.name = '李四' // 触发 setter
      effect(() => {
        document.querySelector('#app').innerText = obj.value.name // 这里一定要暴露出来一个getter的行为,这样我们才可完成依赖的收集
      })
      setTimeout(() => {
        obj.value.name = '李四'
      }, 2000)
    </script>
    
  • 在源码 ref 函数中打上一个断点,我们走一下

    export function ref(value?: unknown) {
      return createRef(value, false)
    }
    
  • 这里,走到了 createRef 函数中,我们再进入看下

    function createRef(rawValue: unknown, shallow: boolean) {
      // 这个跳过
      if (isRef(rawValue)) {
        return rawValue
      }
      // 会执行这个
      return new RefImpl(rawValue, shallow)
    }
    
  • 跳入 isRef 函数

    export function isRef(r: any): r is Ref {
      return !!(r && r.__v_isRef === true)
    }
    
  • 这个判断也是很简单,__v_isRef 这个标识为 true, 则是一个ref对象,目前不会走这儿

  • 我们跳出,我们再看下 RefImpl 这个类

    class RefImpl<T> {
      private _value: T
      private _rawValue: T
    
      public dep?: Dep = undefined // 这里是 Set
      public readonly __v_isRef = true // 注意看这里的标识,在这里创建实例后,就有了这个 buff 属性
      // 构造函数中的 value 就是我们 name为张三的 object, __v_isShallow 这个参数是否是浅层的,可以理解为简单类型
      constructor(value: T, public readonly __v_isShallow: boolean) {
        // 这里会走 toRaw
        this._rawValue = __v_isShallow ? value : toRaw(value) // 这里 _rawValue 本质上就是 value
        // 这里会走 toReactive
        this._value = __v_isShallow ? value : toReactive(value) // 这里 _value 本质上 被 reactive方法包裹变成了一个响应式对象
      }
    
      get value() {
        trackRefValue(this)
        return this._value
      }
    
      set value(newVal) {
        const useDirectValue =
          this.__v_isShallow || isShallow(newVal) || isReadonly(newVal)
        newVal = useDirectValue ? newVal : toRaw(newVal)
        if (hasChanged(newVal, this._rawValue)) {
          this._rawValue = newVal
          this._value = useDirectValue ? newVal : toReactive(newVal)
          triggerRefValue(this, newVal)
        }
      }
    }
    
  • 进入 toRaw 函数

    export function toRaw<T>(observed: T): T {
      const raw = observed && (observed as Target)[ReactiveFlags.RAW]
      return raw ? toRaw(raw) : observed // 这里return的是 observed 就是原对象
    }
    
  • 跳出 toRaw 进入 toReactive

    export const toReactive = <T extends unknown>(value: T): T =>
      // 注意这里走 reactive,所以这里变成了一个响应性对象
      isObject(value) ? reactive(value) : value
    
  • 看下 get 和 set value的两个函数

    • 我们都知道这个语法的使用,不做过多解释
  • 在 get value 函数中会触发 trackRefValue,我们看看这里, 用于完成依赖收集工作

    export function trackRefValue(ref: RefBase<any>) {
      // 这里会走
      if (shouldTrack && activeEffect) {
        ref = toRaw(ref)
        if (__DEV__) {
          // 注意这里,ref.dep 是一个Set集合
          trackEffects(ref.dep || (ref.dep = createDep()), {
            target: ref,
            type: TrackOpTypes.GET,
            key: 'value'
          })
        } else {
          trackEffects(ref.dep || (ref.dep = createDep()))
        }
      }
    }
    
  • 我们进入 trackEffects 来看下

    export function trackEffects(
      dep: Dep,
      debuggerEventExtraInfo?: DebuggerEventExtraInfo
    ) {
      let shouldTrack = false
      if (effectTrackDepth <= maxMarkerBits) {
        if (!newTracked(dep)) {
          dep.n |= trackOpBit // set newly tracked
          shouldTrack = !wasTracked(dep)
        }
      } else {
        // Full cleanup mode.
        shouldTrack = !dep.has(activeEffect!)
      }
    
      if (shouldTrack) {
        // 这里会执行,进行一对多的收集
        dep.add(activeEffect!)
        activeEffect!.deps.push(dep)
        if (__DEV__ && activeEffect!.onTrack) {
          activeEffect!.onTrack({
            effect: activeEffect!,
            ...debuggerEventExtraInfo!
          })
        }
      }
    }
    
  • 这里完成了依赖的收集

  • 对于 ref 而言,基于 get value 主动触发getter行为,基于 trackRefValue 来完成依赖收集工作,最终返回 this._value

  • 再回到示例中的定时器中

    setTimeout(() => {
        obj.value.name = '李四'
      }, 2000)
    
  • 这里,obj.value 本质上还会触发 getter 行为,但是不会执行,因为 在 trackRefValue 中 的 activeEffect 中不再有值, 因为在 run() 函数里处理了

    activeEffect = this.parent
    shouldTrack = lastShouldTrack
    this.parent = undefined
    
    • 在 get value 下的 trackRefValue(this) 会跳过,不会再走依赖收集的过程
    • obj.value.name 示例程序这里会触发 setter 行为,所以本质上这行代码走了两个行为
      • 1 )触发了 ref 的 get value
      • 2 )触发了 reactive 的 setter 行为,因为本质上触发了 proxy的setter
  • 在这儿,我们可以看出

    • 对于 ref 函数会返回 RefImpl 类型的实例
    • 在该实例中,会根据传入的数据类型进行分开处理
      • 简单类型不做处理
      • 复杂数据类型,转化为 reactive 返回的 proxy 实例
    • 无论我们执行 obj.value.name 还是 obj.value.name = xxx 本质上都是触发了 get value
    • 之所以会进行响应性 因为 obj.value 是一个 reactive 函数生成的proxy

Ref 实现简单类型的响应式

  • 新建示例程序 vue/examples/reactivity/ref-shallow.html

    <script src='../../dist/vue.global.js'></script>
    
    <body>
      <div id='app'></div>
    </body>
    
    <script>
      const { ref, effect } = Vue
      const obj = ref('张三')
      effect(() => {
        document.querySelector('#app').innerText = obj.value
      })
      const timer = setTimeout(() => {
        clearTimeout(timer)
        obj.value = '李四'
      }, 2000)
    </script>
    
  • 上述是简单的字符串类型

  • 整体流程和复杂数据类型一致,我们主要关注的是 set value() 的函数内部实现,源码如下:

      set value(newVal) {
        const useDirectValue =
          this.__v_isShallow || isShallow(newVal) || isReadonly(newVal)
        newVal = useDirectValue ? newVal : toRaw(newVal)
        if (hasChanged(newVal, this._rawValue)) {
          this._rawValue = newVal // 这里将新值挂载
          this._value = useDirectValue ? newVal : toReactive(newVal) // 这里走到了 toReactive 里
          triggerRefValue(this, newVal)
        }
      }
    
  • 简单数据类型和复杂数据类型不同的地方,在于 hasChanged 的if判断

    // compare whether a value has changed, accounting for NaN.
    export const hasChanged = (value: any, oldValue: any): boolean =>
      !Object.is(value, oldValue)
    
  • 判断两个值,是否相等,如果变化了,执行 if 结构里面的程序

  • 之后,走到了 triggerRefValue里面,这个函数和之前类似

export function triggerRefValue(ref: RefBase<any>, newVal?: any) {
  ref = toRaw(ref)
  if (ref.dep) {
    if (__DEV__) {
      triggerEffects(ref.dep, {
        target: ref,
        type: TriggerOpTypes.SET,
        key: 'value',
        newValue: newVal
      })
    } else {
      triggerEffects(ref.dep)
    }
  }
}
  • 这个和之前是一致的

  • 到现在,我们知道,ref中简单的数据类型并不是通过 proxy 来响应的,而是基于 RefImpl 的 get 和 set value 来收集和触发的,这就是 .value 的关键

  • 也就是说 .value 是一个适配器,里面封装了对简单和复杂数据类型的处理

删减后的核心实现代码

  • 参考上篇文章的rollup构建环境搭建

1 )复杂类型的程序处理

  • 创建 reactivity/ref.ts 模块

    import { toReactive } from './reactive'
    import { createDep, Dep } from './dep'
    import { activeEffect, trackEffects } from './effect'
    
    export interface Ref<T = any> {
      value: T
    }
    
    export function ref(value?: unknown) {
      return createRef(value, false)
    }
    
    function createRef(rawValue: unknown, shallow: boolean) {
      if (isRef(rawValue)) {
        return rawValue
      }
    
      return new RefImpl(rawValue, shallow)
    }
    
    class RefImpl<T> {
      private _value: T
      public dep?: Dep = undefined
      public readonly __v_isRef = true
    
      constructor (value: T, public readonly __v_isShallow: boolean) {
        this._value = __v_isShallow ? value: toReactive(value)
      }
    
      get value() {
        trackRefValue(this)
        return this._value
      }
    
      set value(newValue) {
      }
    }
    
    export function trackRefValue(ref) {
      if (activeEffect) {
        trackEffects(ref.dep || (ref.dep = createDep()))
      }
    }
    
    export function isRef(r: any): r is Ref {
      return !!(r && r.__v_isRef === true)
    }
    
  • 在 reactivity/reactive.ts 模块中创建 toReactive 函数

    import { isObject } from '@vue/shared'
    
    export const toReactive = <T extends unknown>(value: T): T => 
      isObject(value) ? reactive(value as object) : value
    
  • 在 reactivity/index.ts 中 导出 ref

    export { ref } from './ref'
    
  • 创建一个复杂类型的测试实例

    <script src="../dist/vue.js"></script>
    <body>
      <div id='app'>
      </div>
    </body>
    
    <script>
      const { ref, effect } = Vue
      // console.log(reactive)
      const obj = ref({
        name: '张三'
      })
      // console.log(obj.name) // 触发getter
      // obj.name = '李四' // 触发 setter
      effect(()=>{
        document.querySelector('#app').innerText = obj.value.name // 这里一定要暴露出来一个getter的行为,这样我们才可完成依赖的收集
      })
    
      setTimeout(() => {
        obj.value.name = '李四'
      }, 2000)
    </script>
    
  • 基于以上,可知已完成了响应式的功能,备注,需要依赖上篇博客中的一些实现

  • 以上, 我们实现了 ref 复杂数据类型响应性

    • 本质还是利用 reactive 函数 来实现,都是返回一个 proxy,利用其 getter和setter来完成依赖收集和依赖触发
    • 需要实现简单类型的响应式,主要区别在于 set value() 函数

2 ) 简单类型的响应性逻辑

  • 在 ref.ts中添加

    import { hasChanged } from '@vue/shared'
    
    class RefImpl<T> {
      private _rawValue: T // 添加
    
      constructor(value: T, ) {
        this._rawValue = value // 添加这行
      }
    
      set value(newVal) {
        if (hasChanged(newVal, this._rawValue)) {
          this._rawValue = newVal
          this._value = toReactive(newVal)
          triggerRefValue(this)
        }
      }
    }
    
    export function triggerRefValue(ref) {
      if (ref.dep) {
        triggerEffects(ref.dep)
      }
    }
    
  • 新建简单类型测试程序

    <script src="../dist/vue.js"></script>
    <body>
      <div id='app'>
      </div>
    </body>
    
    <script>
      const { ref, effect } = Vue
      const obj = ref('张三')
    
      effect(()=>{
        document.querySelector('#app').innerText = obj.value // 这里一定要暴露出来一个getter的行为,这样我们才可完成依赖的收集
      })
    
      setTimeout(() => {
        obj.value = '李四'
      }, 2000)
    </script>
    
  • 此时,就完成了 自己实现的 ref 响应式了

    • ref 简单类型响应性不具备数据监听的概念, 而是通过 get和set value来实现的对简单类型的处理
    • ref 是一个适配器, 对复杂和简单类型分别处理

总结

  • ref做的三件事情
    • 返回RefImpl实例
    • 在构造函数中,对传入数据进行处理:当前传入value是简单类型,则直接使用;否则,使用reactive函数包裹,让ref.value的值变成响应式数据
    • 启动两个函数:get value, set value
Vue 2到Vue 3升级实战:从评估、迁移到验证的全流程指南 前端框架的版本升级是大型项目演进中的关键环节,其核心在于响应式系统与组件化架构的迭代。Vue 3通过基于Proxy的全新响应式机制和Composition API,在性能优化与开发体验上实现了显著提升,这为构建高性能、可维护的现代Web应用提供了坚实的技术基础。在实际工程实践中,此类升级往往涉及依赖库兼容性、API变更适配以及构建工具链重构等多重挑战,尤其对于使用了Element UI等大型UI组件库的项目,需要系统性的迁移策略。本文聚焦于Vue 2.9.6至Vue 3.0的升级全过程,详细拆解了从项目现状 阅读详情

相关推荐

七天搞定前端面试八股文:高频考点与答题框架

在2026年前端岗位的面试中,面试官越来越关注候选人对底层原理与工程实践的理解,而非框架API的背诵。以事件循环为例,它决定了异步任务的执行顺序,理解微任务与宏任务的调度机制,是编写可靠JavaScript代码的基础;Vue3的响应式原理通过Proxy拦截get/set,实现依赖收集与触发更新,体现了状态驱动UI的核心思想。这些概念相互关联,共同构成了前端知识地图的关键节点。掌握这些原理,不仅有助于解决性能优化、复杂交互等实际工程问题,也能在简历项目复盘时给出更有深度的回答。面对高频考点分散、复习缺乏抓手的

weixin_30475039的博客 312

Vue 3 第四章:ref全家桶及源码分析

这篇文章介绍了Vue3中的ref函数、isRef函数、shallowRef函数和customRef函数。ref函数主要用于创建响应式对象,引用DOM实例,引用组件实例等。isRef函数主要用于判断传入的数据是不是响应式对象。shallowRef函数创建一个“浅层”的响应式对象,只追踪值的属性变化,而不追踪对象内部属性的变化。customRef函数可以创建自定义的引用对象,可以自定义get和set方法的实现逻辑。此外,文章还介绍了triggerRef函数

to_the_Future的博客 2596

前端犄角旮旯,非常规面试题总结(不断更新....)

27、判断类型的方式有哪些?1、typeof操作符:用来检测数据的类型,返回的是一个表示类型的字符串。2、instanceof操作符:用来检测对象是否为指定的构造函数的实例。3、方法:可以返回对象的准确类型。4、方法:用来判断一个变量是否为数组。(一)typeof和instanceof区别typeof返回的是一个字符串,表示变量的数据类型,可能的返回值有numberstringbooleanfunctionundefinedobject。instanceof返回的是一个布尔值,true或。

qq_51398495的博客 1666

【Vue3源码】第六章 ref的原理 实现ref

【Vue3源码】第五章 ref的原理 实现ref上一章节我们实现了reactive 和 readonly 嵌套对象转换功能,以及shallowReadonly 和isProxy几个简单的API。这一章我们开始实现 ref 及其它配套的isRef、unRef 和 proxyRefs。

m0_68324632的博客 2190

从理论到实践:TRL去嵌入校准在国产矢量网络分析仪上的应用全解析

本文全面解析了TRL去嵌入校准技术在国产矢量网络分析仪上的应用实践,从核心算法到工程实现。详细介绍了TRL校准的数学原理、国产VNA的程控接口开发、校准件质量评估及测量不确定度控制策略,帮助工程师掌握高频器件测量的关键技术。

tech5的博客 1016

TPAMI 2025新作LRFormer复现笔记:我的Windows 11 + RTX 4090配置全流程

本文详细记录了在Windows 11系统下使用RTX 4090显卡复现TPAMI 2025顶会论文LRTransformer的完整流程,包括硬件配置、系统优化、Python环境搭建及模型训练中的常见问题解决方案。特别针对Windows平台特有的路径管理、CUDA版本冲突和显存优化等关键技术细节提供了实用指南,帮助开发者高效完成环境搭建和模型训练。

weixin_29094301的博客 414

vue3.0(四) ref全家桶以及响应的 源码分析

vue3.0(四) ref全家桶以及响应的 源码分析, ref,isRef,unref,shallowRef,triggerRef, customRef, Ref 泛型写法

chengcheng9876的博客 1508

速腾聚创多激光雷达点云采集,并用RVIZ进行显示

在ubuntu20.04系统下,使用速腾聚创官方提供的软件RSView,对激光雷达的默认IP地址、MSOP 包端口号、 DIFOP包端口号和时间模式等配置进行查看和修改。使用交换机对两个激光雷达进行组网,实现多激光雷达数据采集,并用RVIZ同时显示两个雷达点云。使用wireshark对比两个雷达数据包。

abanchao的博客 5889

Vue3源码之Refs

前言 Vue3的响应性API除了reactive、readonly等基础的,还提供了相关Refs API其中包括ref、customRef等。在之前的[响应系统](https://blog.youkuaiyun.com/s1879046/article/details/118757873)的文章中,对reactive的逻辑有较为详细的分析,本文会对梳理相关API的逻辑,对比reactive API看看二者的不同,加强对Refs API使用的理解。

玉案轩窗的博客 1495

【学习笔记】人群归因分数 PAF 以及combined PAF

人群归因风险比例(Population Attributable Fraction,PAF)是一个流行病学指标,它估计了在总体中,如果能消除一个特定的危险因素,能预防多少百分比的疾病或健康结果。简单来说,PAF回答的是:“如果没有这个风险因素,总体中会有多少病例是可以避免的?

weixin_53499537的博客 4905

Origin软件XRD全峰拟合保姆级教程:从数据导入到弱峰处理技巧

本文提供了一份Origin软件进行XRD全峰拟合的深度实战指南。文章重点解析了从数据导入预处理、基线锚点视觉化设置,到弱峰拟合的锁定策略与手动干预等核心技巧,旨在帮助用户避开常见错误,获得可靠、精确的拟合结果,从而有效服务于材料结构分析。

rgv2345678的博客 708

Vue3笔记

渲染快,虚拟 DOM 重写(优化 diff 算法),静态节点提升(Static Hoisting)和补丁标记(Patch Flags),减少运行时开销。Vue 3 于 2020 年 9 月发布,是 Vue.js 的重大升级版本,主要改进包括性能优化、新特性引入和更好的 TypeScript 支持。3.更好的 TypeScript 支持:源码使用 TypeScript 重写,提供完整的类型定义,开发体验更友好,IDE 提示更精准。目的:解决逻辑复用和代码组织问题(替代 Options API 的局限性)。

zxz86的博客 657

飞牛fnNAS搭建Web网页版OFFICE(WPS)软件

本文介绍了如何在飞牛NAS上通过Docker容器部署WPS Office办公软件。主要内容包括:启用Docker服务、准备项目文件夹结构、使用Compose方式构建容器、解决端口冲突问题、配置中文输入法和字体库,以及通过ZeroTier实现远程访问。文章详细说明了每个步骤的操作方法,包括容器启动、输入法设置、字体添加和文件存储位置配置。最后还介绍了使用ZeroTier内网穿透技术实现远程访问NAS上WPS服务的方法,让用户可以在不同设备上随时编辑NAS中的文件。整个部署过程完整清晰,为NAS用户提供了便捷的

dgnankai的专栏 1702

VUE3 面试题总结

单文件组件< script setup > < script setup > </script> 可以直接引入,定义,逻辑,无需return返出数据 直接import引入子组件后在页面直接使用,无需注册 替代props功能的是: defineProps({}) 替代emit功能的是:defineEmits([]) 点击的dom上@click="skip" 例:cons...

hjdjhh的博客 2273

【RK3399 Ubuntu】基于rk3399的lxde的lubuntu桌面移植适配记录之第二步:最基本Ubuntu根文件系统的相关常用工具完善

文章目录1.使能系统网络管理服务1.1 安装驱动modules管理工具1.2 使能网络服务2.终端自动补全命令功能3.安装ssh服务4.安装系统信息查看工具5.安装resize工具6.安装lrzsz工具7.使能rc.local服务7.1 修改服务Install块7.2 使能rc.local.service服务7.3 添加执行脚本且赋予执行权限 续接上文,本文主要完善前面已经制作好的rootfs 1.使能系统网络管理服务 1.1 安装驱动modules管理工具 apt-get install kmod 1.

wang 恒 的博客 1387

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

Vue.js核心原理与面试高频考点解析

响应式系统是现代前端框架的核心机制,通过数据绑定实现视图自动更新。Vue2采用Object.defineProperty实现响应式,而Vue3升级为Proxy方案,解决了数组变异和新增属性的监听问题。虚拟DOM技术通过JS对象描述页面结构,配合Diff算法实现高效更新,其中key的合理使用对性能优化至关重要。在Vue3组合式API中,ref和reactive分别处理基础类型和对象类型的响应式转换,toRefs可保持解构后的响应性。这些核心技术广泛应用于表单处理、状态管理等场景,也是前端工程师面试中的高频考点

weixin_34212762的博客 620

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

2026年前端面试趋势:WebSocket优化与Vue3响应式实战

WebSocket作为现代实时通信的核心技术,通过全双工协议实现低延迟数据传输,在直播弹幕、在线协作等场景具有不可替代的优势。其技术原理基于HTTP升级机制,通过建立持久连接减少握手开销,相比传统轮询方案可降低80%以上的延迟。在工程实践中,开发者需要掌握连接管理、心跳检测、消息分区等优化手段,特别是在处理百万级并发时,需结合Nginx负载均衡和集群部署方案。Vue3的响应式系统通过Proxy重构带来性能提升,其中ref和reactive的差异化使用直接影响应用性能,如表单字段推荐使用ref而复杂对象使用r

weixin_34117211的博客 286

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

Vue3 setup返回值详解:从模板渲染到响应式原理的完整指南

在Vue3组合式API中,setup函数是逻辑组织的核心入口,其返回值决定了模板渲染上下文的数据来源。理解返回对象与渲染函数的区别,以及ref/reactive响应式数据的暴露规则,是掌握现代前端框架的关键。通过返回值,组件能够将内部状态和方法安全地暴露给模板,同时保持逻辑的聚合性与可维护性。在实际工程中,无论是构建用户交互组件、列表页还是复杂表单,合理设计setup的返回值都能显著降低调试成本。当遇到数据不更新或模板显示undefined时,大多与返回值或响应式丢失有关。本文从概念到原理,结合典型报错与最

weixin_34310369的博客 358

Vue的知识点

onBeforeUnmount(() => console.log('🔵 父 beforeUnmount'))onBeforeUnmount(() => console.log('🟢 子 beforeUnmount'))onBeforeMount(() => console.log('🔵 父 beforeMount'))onBeforeMount(() => console.log('🟢 子 beforeMount'))console.log(`修改 ${String(key)} = ${value

2401_88055323的博客 238

深入理解 Vue 3 Composition API:为什么它是现代前端的必修课

摘要 Vue 3是一款渐进式JavaScript框架,用于构建用户界面。它采用声明式渲染和响应式设计,支持单页应用开发。Vue 3的主要升级包括: Composition API提升代码组织和复用性 基于Proxy的响应式系统解决Vue 2的痛点 更好的TypeScript支持和更小的体积 安装使用Vite构建工具: 准备Node.js环境 通过npm create vue@latest创建项目 安装依赖并启动开发服务器 核心功能: 响应式数据:使用ref和reactive 模板指令:v-bind、v-mo

jaychoushsj的博客 164

前端春招实习面经:高频考点与面试实战技巧复盘

前端面试是检验开发者综合能力的试金石,也是春招实习生的必争之地。无论是JavaScript闭包、this指向、事件循环等语言基础,还是Vue响应式原理、组件通信、diff算法等框架核心,面试官都倾向于以场景化问题考察候选人的工程思维。理解这些技术背后的设计初衷,并能结合浏览器缓存、性能优化等实际部署经验进行阐述,是脱颖而出的关键。本文汇总了真实春招实习面试中的高频考点与复盘思路,从答题框架、踩坑记录到学习路径,为备战实习面试的候选人提供可直接演练的模拟题清单与沟通话术。

weixin_33754065的博客 488

React面试题笔记(一)

React面试题笔记(一)

qq_42750608的博客 1249

Vue3源码【一】—— ref&reactive响应式原理及简单实现

本文深入剖析了Vue3中ref和reactive的工作机制及背后的响应式原理。文章首先揭示了ref是如何将一个普通值封装成响应式的,并返回一个可访问该值的响应式对象。接着,详细讨论了reactive如何使用Proxy来实现对象的响应式转换,使其所有属性的变化都能被Vue3精确捕捉。文中进一步探讨了Vue3响应式系统的内核,即依赖追踪和派发更新机制,展示了它们如何确保界面与状态的一致性。

共勉 3624

Vue3源码解析之Ref、Effect

上篇文章详细讲解了响应式原理中的核心方法reactive,这篇文章我们继续讲解响应式原理中的另一个核心方法ref以及副作用函数effect,本文参考源码版本为。

chenlmw的博客 2183

Vue3 —— ref 全家桶及源码学习

ref 全家桶及源码学习:包括 ref、isRef、shallowRef、triggerRef、customRef

weixin_42289080的博客 561
上一篇: Vue3源码梳理:reactive的响应性核心实现
下一篇: 数据结构与算法之字符串: LeetCode 557. 反转字符串中的单词 III (Ts, Py, Go, Java版)
Wang's Blog
博客等级 码龄12年 7433粉丝 2421原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wang's Blog

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值