在 Vue 3 中,ref 是一个强大的特性,用于处理组件和 DOM 元素的引用。它有两个主要的应用场景:一是在模板中引用 DOM 元素,二是在 Vue 组件中引用子组件实例。
1. 在模板中使用 ref 引用 DOM 元素
- 目的:直接访问和操作 DOM 元素。
- 用法:
在模板中的 DOM 元素上添加 ref 属性:
<template><div ref="myDiv">Hello, World!</div><button @click="changeText">Change Text</button>
</template>
在 setup 函数中访问该元素:
<script setup>
import { ref, onMounted } from 'vue';const myDiv = ref(null);onMounted(() => {if (myDiv.value) {myDiv.value.textContent = 'Text Changed!';}
});function changeText() {if (myDiv.value) {myDiv.value.textContent = 'New Text!';}
}
</script>
说明:
- ref=“myDiv” 在模板中为 DOM 元素 div 添加一个引用标识符。
- myDiv 是一个响应式的 ref 对象,其 .value 属性包含实际的 DOM 元素。
- 在 onMounted 钩子中,你可以确保 DOM 元素已经挂载,然后通过 myDiv.value 访问并修改它的内容。
2. 引用子组件实例
- 目的:访问子组件的方法或属性。
- 注意:子组件需要暴露一些东西。要让父组件访问子组件的属性或方法
父组件
<template><ChildComponent ref="childRef" /><button @click="callChildGreet">Call Child Greet</button>
</template><script setup>
import { ref } from 'vue';
import ChildComponent from './ChildComponent.vue';const childRef = ref(null);function callChildGreet() {if (childRef.value) {childRef.value.greet();}
}
</script>
子组件
<template><div><p>Child Component</p></div>
</template><script setup>
import { defineExpose } from 'vue';function greet() {console.log('Hello from child!');
}// 使用 defineExpose 暴露方法
defineExpose({greet
});
</script>
在这个例子中,ChildComponent 通过 defineExpose 暴露了 greet 方法,父组件可以通过 ref 引用调用该方法。