Vue ref 类型总结
【摘要】 在 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):判断是否是refunref(x):取值,自动判断是否为ref
总结建议
| 场景 | 推荐 ref 类型 |
|---|---|
| 模板中访问 DOM 或组件 | ref="xxx"(选项式) |
| 定义响应式变量 | ref()(组合式) |
| 响应式对象属性解构 | toRef() / toRefs() |
| 避免深层代理开销 | shallowRef() |
| 控制响应式更新机制 | customRef() |
简洁处理 ref 值 |
unref() |
如需具体代码示例或配合 reactive/watch 等 API 使用,可继续告诉我。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)