当前位置:首页 > 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

模板中的自动解包

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

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

依赖收集与触发

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

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

    ref实现原理vue

源码关键点

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

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

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

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

相关文章

css动画制作原理

css动画制作原理

CSS动画制作原理 CSS动画通过改变元素的样式属性实现动态效果,主要依赖关键帧(@keyframes)和动画属性(如animation-name、animation-duration)的配合。核心原…

vue $emit实现原理

vue $emit实现原理

Vue $emit 实现原理 Vue 的 $emit 方法是实现组件间通信的核心机制之一,主要用于子组件向父组件传递事件和数据。其实现原理主要基于 Vue 的事件系统和发布-订阅模式。 事件注册与监…

vue nexttick实现原理

vue nexttick实现原理

Vue nextTick 实现原理 Vue 的 nextTick 是一个核心工具方法,用于在 DOM 更新后执行回调函数。其实现原理涉及 JavaScript 的事件循环机制和异步任务调度。 异步任…

vue实现路由原理

vue实现路由原理

Vue 路由实现原理 Vue Router 是 Vue.js 官方的路由管理器,用于构建单页面应用(SPA)。其核心原理基于前端路由技术,通过监听 URL 变化并动态渲染组件。 路由模式 Vue R…

vue click 实现原理

vue click 实现原理

Vue 中 @click 的实现原理 Vue 的 @click 指令本质上是基于原生 DOM 事件机制的封装,通过 Vue 的模板编译和事件系统实现。以下是其核心实现原理: 模板编译阶段 Vue 模…