Vue ref 类型总结

举报
yd_47669746 发表于 2026/10/29 16:40:57 2026/10/29
【摘要】 在 Vue 中,ref 是非常重要的 API,用于在模板或组件中引用 DOM 元素或组件实例。Vue 不同版本中提供了多种类型的 ref,包括选项式 API 和组合式 API 形式。下面是对几种 ref 类型的总结及其适用场景: 一、几种常见的 ref 类型类型所属 API用法作用对象返回值常见场景ref (选项式 API)Vue 2.x / 3.xref="xxx"DOM 或子组件$ref...

在 Vue 中,ref 是非常重要的 API,用于在模板或组件中引用 DOM 元素或组件实例。Vue 不同版本中提供了多种类型的 ref,包括选项式 API 和组合式 API 形式。下面是对几种 ref 类型的总结及其适用场景:


一、几种常见的 ref 类型

类型 所属 API 用法 作用对象 返回值 常见场景
ref (选项式 API) Vue 2.x / 3.x ref="xxx" DOM 或子组件 $refs.xxx 访问 DOM 或子组件方法
ref() (组合式 API) Vue 3.x const count = ref(0) 响应式数据 响应式引用对象 数据响应式、共享数据
toRef() Vue 3.x toRef(obj, 'prop') 对象的属性 引用该属性的 ref 解构时保持响应性
toRefs() Vue 3.x toRefs(obj) 整个对象 所有属性的 ref 集合 解构多个响应式属性
shallowRef() Vue 3.x shallowRef(obj) 非深层响应式对象 响应式引用对象(浅层) 引用大型对象避免性能问题
triggerRef() Vue 3.x triggerRef(r) 强制更新 shallowRef void 手动触发更新
customRef() Vue 3.x customRef(factory) 自定义 getter/setter 响应式引用对象 实现节流、防抖等逻辑
unref() Vue 3.x unref(myRef) 获取 ref 的值 值 简化访问逻辑
isRef() Vue 3.x isRef(x) 判断是否是 ref Boolean 运行时类型判断

二、使用场景详解

1. 模板中 DOM 或子组件访问:

<template>
  <input ref="inputEl" />
</template>

<script>
export default {
  mounted() {
    this.$refs.inputEl.focus();
  }
}
</script>

📌 适用场景:需要直接操作 DOM 或调用子组件的方法(Vue 2 和 Vue 3 中都适用)。


2. 响应式数据定义(组合式 API):

import { ref } from 'vue';
const count = ref(0);

📌 适用场景:在组合式 API 中创建响应式数据,适合任何响应式变量的定义。


3. 对象属性解构保持响应式:

const state = reactive({ a: 1, b: 2 });
const { a, b } = toRefs(state);

📌 适用场景:从响应式对象中提取多个属性时,保持响应性。


4. 浅层响应式对象引用(性能优化):

const shallow = shallowRef({ a: 1 });

📌 适用场景:避免深层响应式开销,适用于大型对象或第三方库数据。


5. 自定义响应式逻辑(如节流防抖):

const debounced = customRef((track, trigger) => {
  let value;
  return {
    get() {
      track();
      return value;
    },
    set(newVal) {
      value = newVal;
      debounce(() => trigger(), 200)();
    }
  };
});

📌 适用场景:实现复杂响应式控制,如防抖、节流、验证等。


6. 判断与解包工具:

  • isRef(x):判断是否是 ref
  • unref(x):取值,自动判断是否为 ref

总结建议

场景 推荐 ref 类型
模板中访问 DOM 或组件 ref="xxx"(选项式)
定义响应式变量 ref()(组合式)
响应式对象属性解构 toRef() / toRefs()
避免深层代理开销 shallowRef()
控制响应式更新机制 customRef()
简洁处理 ref 值 unref()

如需具体代码示例或配合 reactive/watch 等 API 使用,可继续告诉我。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。