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

vue的ref实现

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 直接返回代理对象,适合处理复杂对象结构但无法直接替换整个引用。

vue的ref实现

自定义 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 用于组件时,会指向组件实例:

<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中实现无限滚动列表通常结合监听滚动事件和动态加载数据。以下是几种常见方法: 使用自定义指令 创建自定义指令v-infinite-scroll监听滚动事件:…

vue实现同步

vue实现同步

Vue 实现同步的方法 在 Vue 中实现同步操作通常涉及数据绑定、状态管理和异步操作的处理。以下是几种常见的方法: 使用计算属性(Computed Properties) 计算属性基于响应式依赖进…

vue实现建模

vue实现建模

Vue 实现建模的方法 在 Vue 中实现建模通常涉及数据绑定、组件化和状态管理。以下是几种常见的方法: 数据驱动建模 Vue 的核心是数据驱动视图。通过定义数据模型,Vue 会自动更新 DOM。…

vue实现pie

vue实现pie

Vue 实现饼图 在 Vue 中实现饼图通常可以通过第三方图表库(如 ECharts、Chart.js 或 Highcharts)来完成。以下是使用 ECharts 和 Chart.js 的两种常见方…

vue实现翻译

vue实现翻译

Vue 实现翻译功能的方法 使用 i18n 插件实现多语言切换 安装 vue-i18n 插件: npm install vue-i18n 创建语言资源文件(如 en.json 和 zh.json)…

vue 实现搜索

vue 实现搜索

实现 Vue 搜索功能 在 Vue 中实现搜索功能通常涉及以下几个关键步骤: 数据绑定与输入监听 使用 v-model 双向绑定搜索输入框的值,监听用户输入: <template>…