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

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

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

reactive 的区别

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

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

vue的ref实现原理

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

相关文章

vue表格重置怎么实现

vue表格重置怎么实现

重置表格数据的方法 在Vue中重置表格数据通常需要操作绑定的数据源,以下是几种常见实现方式: 直接重置数据源 // 假设表格绑定的是tableData this.tableData = [..…

vue实现拍照

vue实现拍照

Vue实现拍照功能 在Vue中实现拍照功能通常需要结合浏览器的MediaDevices API和Canvas元素。以下是具体实现方法: 安装依赖(可选) 如果需要更简单的封装,可以安装vue-w…

实现vue table

实现vue table

Vue 表格实现方法 基础表格实现 使用 Vue 的 v-for 指令可以快速渲染表格数据。在模板中定义表格结构,通过数据绑定动态生成行和列。 <template> <tabl…

vue实现监听

vue实现监听

监听数据变化 在Vue中,可以通过watch选项或$watch方法监听数据的变化。watch适用于组件选项内声明式监听,$watch适用于动态监听。 // 选项式API export default…

vue mvvm 实现

vue mvvm 实现

Vue MVVM 实现原理 Vue.js 的 MVVM(Model-View-ViewModel)架构通过数据绑定和响应式系统实现视图与数据的自动同步。以下是其核心实现机制: 数据劫持与响应式系统…

vue实现尺子

vue实现尺子

Vue 实现尺子组件 实现一个尺子组件可以通过 Canvas 或纯 CSS 完成。以下是两种常见实现方式: 使用 Canvas 绘制尺子 通过 Canvas 动态绘制刻度线和数字,适合需要高精度或动…