当前位置:首页 > VUE

vue ref实现原理

2026-01-17 08:30:11VUE

vue ref实现原理

Vue 3 中 ref 的实现原理

ref 是 Vue 3 响应式系统的核心 API 之一,用于将基本类型或对象转换为响应式引用。以下是其实现原理的关键点:

vue ref实现原理

核心机制

  • ref 通过创建一个包装对象(RefImpl 实例)实现响应式。该对象包含一个 value 属性,访问或修改时会触发依赖收集和更新。
  • 对于基本类型(如 numberstring),ref 直接包装其值;对于对象类型,内部会调用 reactive 进行深层响应式处理。

源码简化逻辑

class RefImpl {
  constructor(value) {
    this._value = isObject(value) ? reactive(value) : value;
    this.dep = new Set(); // 存储依赖的 effect
  }

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

  set value(newVal) {
    if (hasChanged(this._value, newVal)) {
      this._value = isObject(newVal) ? reactive(newVal) : newVal;
      triggerRefValue(this); // 触发更新
    }
  }
}

function ref(value) {
  return new RefImpl(value);
}

reactive 的区别

  • ref 通过 .value 访问数据,适合包装基本类型或需要直接替换整个对象的情况。
  • reactive 直接返回代理对象,适用于复杂对象的深层响应式转换,但无法处理基本类型。

性能优化

  • ref 对基本类型的处理比 reactive 更轻量,避免不必要的代理开销。
  • 通过 hasChanged 检查值是否变化,避免重复触发更新。

模板中的自动解包

在模板中使用 ref 时,Vue 会自动解包 .value,无需显式调用:

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

<template>
  <button @click="count++">{{ count }}</button> <!-- 自动解包 -->
</template>

关键设计思想

ref 的设计解决了 JavaScript 中基本类型无法通过 Proxy 实现响应式的问题,通过包装对象的方式统一了响应式数据的访问接口,同时保持与 reactive 的协同工作能力。

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

相关文章

vue筛选实现

vue筛选实现

Vue 筛选实现方法 使用计算属性实现筛选 计算属性是 Vue 中实现数据筛选的常用方式。通过定义一个计算属性,可以根据输入的条件动态过滤数据。 <template> <div…

vue实现加减

vue实现加减

Vue 实现加减功能 在 Vue 中实现加减功能可以通过数据绑定和事件监听来完成。以下是一个简单的实现方法: 模板部分 <template> <div> <…

vue实现增删

vue实现增删

Vue 实现增删功能 在 Vue 中实现增删功能通常涉及数据绑定、事件处理和列表渲染。以下是基于 Vue 2 或 Vue 3 的实现方法: 数据定义 初始化一个数组用于存储列表数据,并在 Vue 实…

vue 实现$(id)

vue 实现$(id)

在 Vue 中实现类似 jQuery 的 $(id) 功能,可以通过以下几种方式操作 DOM 元素: 使用 ref 属性 Vue 推荐使用 ref 属性来直接访问 DOM 元素或组件实例。在模板中为…

vue 实现循环

vue 实现循环

Vue 实现循环的方法 在 Vue 中,可以使用 v-for 指令来实现循环渲染列表数据。以下是几种常见的循环实现方式: 基本数组循环 <template> <ul>…

vue实现spa

vue实现spa

Vue 实现 SPA(单页应用)的步骤 创建 Vue 项目 使用 Vue CLI 快速初始化一个 Vue 项目,确保安装了 Vue Router 作为路由管理工具。运行以下命令创建项目: vue c…