当前位置:首页 > VUE

ref实现原理vue

2026-01-18 09:54:50VUE

ref 的实现原理(Vue 3)

在 Vue 3 中,ref 是响应式系统的核心 API 之一,用于将基本类型或对象转换为响应式引用。其实现依赖于 ES6 的 Proxygetter/setter 机制。

基本类型处理
对于基本类型(如 numberstring),ref 会通过一个包装对象实现响应式。内部通过 value 属性访问实际值,触发依赖收集和更新通知:

function ref(value) {
  return createRef(value, false);
}

function createRef(rawValue, shallow) {
  // 已经是 ref 则直接返回
  if (isRef(rawValue)) return rawValue;
  return new RefImpl(rawValue, shallow);
}

class RefImpl {
  constructor(value, __v_isShallow) {
    this.__v_isShallow = __v_isShallow;
    this._rawValue = value;
    this._value = __v_isShallow ? value : toReactive(value);
    this.dep = undefined;
  }

  get value() {
    trackRefValue(this); // 依赖收集
    return this._value;
  }

  set value(newVal) {
    if (hasChanged(newVal, this._rawValue)) {
      this._rawValue = newVal;
      this._value = toReactive(newVal);
      triggerRefValue(this); // 触发更新
    }
  }
}

对象类型处理
当传入对象时,ref 会调用 reactive 进行深层响应式转换。通过 toReactive 函数自动处理:

const toReactive = (value) => 
  isObject(value) ? reactive(value) : value;

reactive 的区别

  • 访问方式
    ref 需要通过 .value 访问数据,而 reactive 直接访问属性。

    const count = ref(0);
    count.value++; // 需要 .value
    
    const state = reactive({ count: 0 });
    state.count++; // 直接访问
  • 适用场景
    ref 适用于基本类型或需要替换整个对象的场景,reactive 适用于对象/数组的深层响应式。

模板中的自动解包

在模板中使用 ref 时,Vue 会自动解包,无需手动写 .value

<template>
  <div>{{ count }}</div> <!-- 自动解包 -->
</template>
<script setup>
  const count = ref(0);
</script>

依赖收集与触发

  • 依赖收集
    通过 trackRefValueget value() 时记录当前活跃的 effect(如组件的渲染函数)。

  • 触发更新
    通过 triggerRefValueset value() 时通知所有依赖的 effect 重新执行。

源码关键点

  1. 响应式标记
    ref 对象通过 __v_isRef 标记,便于 isRef 检查。

  2. 性能优化
    多次设置相同值时会通过 hasChanged 比较,避免不必要的更新触发。

  3. 浅层 ref
    通过 shallowRef 可创建仅对 .value 敏感的浅层响应式引用。

ref实现原理vue

标签: 原理ref
分享给朋友:

相关文章

eventbus实现原理vue

eventbus实现原理vue

EventBus 的实现原理(Vue) EventBus 是 Vue 中实现跨组件通信的一种简单机制,其核心原理基于发布-订阅模式(Pub-Sub)。以下是其实现的关键点: 核心机制 事件中心 E…

vue动态渲染实现原理

vue动态渲染实现原理

Vue 动态渲染实现原理 Vue 的动态渲染主要依赖于其响应式系统和虚拟 DOM 技术。以下是核心实现原理的详细分析: 响应式系统 Vue 通过 Object.defineProperty(Vue…

vue实现飘窗原理

vue实现飘窗原理

Vue实现飘窗的原理 Vue实现飘窗功能通常基于组件化开发,结合CSS动画和Vue的数据绑定特性。飘窗一般指悬浮在页面上的可拖动或自动移动的元素,常见于广告、通知等场景。 核心实现步骤 组件结构设计…

vue原理实现

vue原理实现

Vue 的核心原理实现 Vue 的核心原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。以下是这些核心原理的具体实现方式: 响应式系统 Vue 的响应式系统基于 Object.define…

vue 实现原理

vue 实现原理

Vue 实现原理 Vue.js 是一个渐进式 JavaScript 框架,其核心实现原理主要包括响应式系统、虚拟 DOM、模板编译和组件化机制。 响应式系统 Vue 使用 Object.define…

js轮播图实现原理

js轮播图实现原理

轮播图的基本原理 轮播图通过动态切换显示的内容(图片、文本等)实现视觉上的滑动效果。核心原理是利用CSS和JavaScript控制元素的显示与隐藏,或通过变换位置实现滑动动画。 实现方法一:…