当前位置:首页 > VUE

vue的ref实现

2026-02-17 05:37:36VUE

Vue 的 ref 实现原理

Vue 中的 ref 是一个用于响应式数据管理的核心 API,它可以用于基本类型或对象类型的响应式包装。以下是其实现的关键点:

基本类型与对象的处理

对于基本类型(如字符串、数字等),ref 会将其包装为一个带有 value 属性的对象。对于对象类型,ref 会调用 reactive 进行深层响应式处理。

const count = ref(0) // { value: 0 }
const obj = ref({ foo: 1 }) // 等价于 reactive({ foo: 1 })

源码核心逻辑

在 Vue 3 源码中,ref 的实现主要依赖于 RefImpl 类:

class RefImpl<T> {
  private _value: T
  private _rawValue: T
  public readonly __v_isRef = true

  constructor(value: T) {
    this._rawValue = value
    this._value = convert(value)
  }

  get value() {
    track(this, TrackOpTypes.GET, 'value')
    return this._value
  }

  set value(newVal) {
    if (hasChanged(newVal, this._rawValue)) {
      this._rawValue = newVal
      this._value = convert(newVal)
      trigger(this, TriggerOpTypes.SET, 'value', newVal)
    }
  }
}

function convert(value) {
  return isObject(value) ? reactive(value) : value
}

模板中的自动解包

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

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

ref 与 reactive 的区别

ref 通过 .value 访问数据,适合处理基本类型或需要替换整个对象引用的情况。reactive 直接返回代理对象,适合处理复杂对象结构但无法直接替换整个引用。

自定义 ref

可以通过 customRef 创建具有自定义逻辑的 ref:

function useDebouncedRef(value, delay = 200) {
  return customRef((track, trigger) => {
    let timeout
    return {
      get() {
        track()
        return value
      },
      set(newValue) {
        clearTimeout(timeout)
        timeout = setTimeout(() => {
          value = newValue
          trigger()
        }, delay)
      }
    }
  })
}

组件 ref

ref 用于组件时,会指向组件实例:

vue的ref实现

<template>
  <ChildComponent ref="child" />
</template>

<script>
import { ref, onMounted } from 'vue'
export default {
  setup() {
    const child = ref(null)
    onMounted(() => {
      console.log(child.value) // 子组件实例
    })
    return { child }
  }
}
</script>

标签: vueref
分享给朋友:

相关文章

vue登录业务的实现

vue登录业务的实现

实现登录业务的基本流程 在Vue中实现登录业务通常涉及前端界面设计、表单验证、API请求交互、状态管理以及路由控制等环节。以下是核心实现步骤: 登录表单设计与验证 创建包含用户名和密码输入框的登录组…

vue实现引导

vue实现引导

Vue 实现引导功能的方法 使用第三方库 推荐使用 driver.js 或 intro.js 这类专门为 Vue 设计的引导库。这些库提供了完整的 API 和样式,能够快速实现引导功能。 安装 dr…

vue实现pc

vue实现pc

Vue 实现 PC 端应用开发 Vue.js 是一个流行的前端框架,适用于构建 PC 端 Web 应用。以下是关键步骤和最佳实践: 项目初始化 使用 Vue CLI 或 Vite 创建项目:…

vue实现发帖

vue实现发帖

使用 Vue 实现发帖功能 前端实现 创建发帖表单组件,包含标题和内容输入框,以及提交按钮。使用 v-model 绑定表单数据。 <template> <div>…

vue实现抽屉

vue实现抽屉

Vue 实现抽屉组件 抽屉组件是一种常见的 UI 模式,通常用于从屏幕边缘滑出内容。以下是几种实现抽屉的方法: 使用 Vue 原生实现 创建一个基本的抽屉组件,利用 Vue 的过渡和条件渲染功能。…

vue实现vmodel

vue实现vmodel

Vue 实现 v-model Vue 的 v-model 是一个语法糖,用于在表单元素或组件上实现双向数据绑定。以下是其实现方式和原理的详细说明。 在表单元素上使用 v-model v-model…