当前位置:首页 > VUE

vue的ref实现原理

2026-02-22 18:09:58VUE

Vue 的 ref 实现原理

Vue 的 ref 是一个用于响应式数据绑定的核心 API,其实现原理主要涉及以下几个关键点:

响应式数据的基础

Vue 3 使用 Proxy 对象实现响应式数据,而 ref 是对基本数据类型(如 numberstringboolean)的封装。由于 Proxy 无法直接代理基本类型,ref 通过将其包装为一个对象({ value: ... })来实现响应式。

ref 的核心实现

ref 的核心逻辑是将传入的值包装为一个带有 value 属性的对象,并通过 ReactiveEffecttrack/trigger 机制实现依赖收集和触发更新。

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

function createRef(rawValue, shallow) {
  if (isRef(rawValue)) {
    return rawValue;
  }
  return new RefImpl(rawValue, shallow);
}

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

  get value() {
    trackRefValue(this);
    return this._value;
  }

  set value(newVal) {
    newVal = this.__v_isShallow ? newVal : toRaw(newVal);
    if (hasChanged(newVal, this._rawValue)) {
      this._rawValue = newVal;
      this._value = this.__v_isShallow ? newVal : toReactive(newVal);
      triggerRefValue(this, newVal);
    }
  }
}

依赖收集与触发更新

  • trackRefValue:在读取 ref.value 时,会调用 track 函数收集当前活跃的副作用(如 effectcomputed)。
  • triggerRefValue:在修改 ref.value 时,会调用 trigger 函数触发依赖该 ref 的副作用重新执行。

模板中的自动解包

在 Vue 模板中,ref 会被自动解包,无需通过 .value 访问:

vue的ref实现原理

<template>
  <div>{{ count }}</div> <!-- 自动解包,无需写 count.value -->
</template>

<script setup>
const count = ref(0);
</script>

reactive 的区别

  • ref 适用于基本类型和对象,访问需通过 .value
  • reactive 仅适用于对象,直接访问属性,无需 .value

ref 的实现体现了 Vue 响应式系统的核心思想,通过封装和依赖管理实现数据变化到视图更新的自动化。

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

相关文章

vue菜单实现

vue菜单实现

Vue 菜单实现方法 使用 Element UI 的菜单组件 Element UI 提供了现成的菜单组件,适合快速实现导航菜单。安装 Element UI 后,可以直接使用 el-menu 相关组件。…

vue实现dag

vue实现dag

Vue实现DAG(有向无环图) 在Vue中实现DAG(Directed Acyclic Graph,有向无环图)通常涉及数据结构的建模、可视化渲染以及交互逻辑处理。以下是关键实现步骤和示例代码: 数…

vue实现treetable

vue实现treetable

Vue实现TreeTable的方法 使用第三方组件库(如Element UI) Element UI的el-table组件支持树形表格展示,通过设置row-key和tree-props属性即可实现。…

vue如何实现计算

vue如何实现计算

Vue 实现计算的方法 Vue 提供了多种方式来实现计算逻辑,包括计算属性、方法、侦听器等。以下是几种常见的实现方式: 计算属性(Computed Properties) 计算属性是基于它们的响应式…

vue实现搜索过滤

vue实现搜索过滤

Vue 实现搜索过滤 使用计算属性实现搜索过滤 在 Vue 中,计算属性(computed)是实现搜索过滤的常见方法。通过计算属性动态过滤数据,无需修改原始数据。 <template>…

vue实现数据增加

vue实现数据增加

vue实现数据增加的几种方法 在Vue中实现数据增加通常涉及以下几个核心概念和方法: 响应式数据声明 在Vue组件中,使用data选项或ref(Vue 3)声明响应式数据: // Vue…