当前位置:首页 > 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
分享给朋友:

相关文章

vue ref实现

vue ref实现

Vue 中 ref 的实现 在 Vue 中,ref 是一个用于创建响应式引用的 API,适用于基本类型和对象。以下是 ref 的核心实现原理和使用方法。 基本实现原理 ref 通过 Reactive…

vue的基本实现原理

vue的基本实现原理

Vue 的基本实现原理 Vue.js 的核心实现原理主要围绕响应式系统、虚拟 DOM 和模板编译展开。以下是其关键实现机制的详细说明: 响应式系统 Vue 使用 Object.definePro…

vue数组实现原理

vue数组实现原理

Vue 数组响应式原理 Vue 通过重写数组的原型方法来实现对数组变化的监听。Vue 没有直接监听数组的索引变化,而是通过拦截数组的变异方法(如 push、pop、splice 等)来触发视图更新。…

vue实现放大镜原理

vue实现放大镜原理

Vue 实现放大镜原理 实现放大镜效果的核心原理是通过鼠标移动事件获取位置信息,动态计算放大区域并显示放大后的图像。以下是基于 Vue 的实现方法: 基本结构设计 HTML 部分需包含原图容器、放大…

vue实现绑卡的原理

vue实现绑卡的原理

Vue实现绑卡的原理 Vue实现绑卡功能通常涉及表单绑定、数据验证、API交互等核心环节。以下是关键实现原理和步骤: 数据双向绑定 使用v-model指令实现表单输入与Vue实例数据的双向绑定。例…

vue中样式的实现原理

vue中样式的实现原理

Vue 中样式的实现原理 Vue 的样式处理机制基于其核心的响应式系统和虚拟 DOM 技术,通过编译、作用域隔离和动态绑定实现高效的样式管理。 样式作用域隔离 Vue 的单文件组件(SFC)通过 s…