ссылка на шаблон
ref
Ссылка для регистрации элемента или подкомпонента
В составном API ссылка будет храниться ref
так
<template>
<p ref="myDom">hello</p>
</template>
<script lang="ts" setup>
import {
ref, onMounted } from 'vue';
const myDom = ref();
onMounted(() => {
console.log('myDom', myDom.value);
});
</script>
При использовании в обычном элементе DOM ссылкой будет сам элемент; при использовании в подкомпоненте ссылкой будет экземпляр подкомпонента.
Вы должны дождаться монтирования компонента, прежде чем вы сможете получить доступ к ссылке, зарегистрированной ref
Если вам нужно прослушивать изменения в ссылке, обязательно учитывайте ее undefined
значение :
// 使用 watchEffect 监听值的变化
watchEffect(() => {
if (input.value) {
input.value.focus();
} else {
// 此时还未挂载, 或此元素已经被卸载 (例如通过 v-if 控制)
}
});
<template>
<input
type="text"
ref="input"
v-if="isShowed"
/>
<button @click="showInput">showInput</button>
</template>
<script setup lang="ts">
import {
ref, nextTick } from 'vue';
const input = ref();
const isShowed = ref(false);
const showInput = () => {
isShowed.value = true;
nextTick(() => {
// 使用 nextTick
input.value.focus(); // 确保 input 已被挂载再执行 focus()
});
};
</script>
Ссылки на шаблоны в v-for
При использовании ссылки на шаблон v-for
в , соответствующее значение ref представляет собой массив, который будет содержать все элементы, соответствующие всему списку после того, как элемент будет повешен.
<template>
<ul>
<li
v-for="item in list"
ref="itemRefs"
>
{
{ item }}
</li>
</ul>
</template>
<script setup lang="ts">
import {
ref, onMounted } from 'vue';
const list = ref([1, 2, 3]);
const itemRefs = ref([]);
onMounted(() => console.log(itemRefs.value));
</script>
Примечание. Порядок массива ссылок не обязательно соответствует порядку исходного массива.
ссылка на шаблон функции
ref
атрибут может связывать функцию, которая будет вызываться каждый раз при обновлении компонента- Функция получает ссылку на элемент в качестве первого аргумента.
<input :ref="(el) => { /* 将 el 赋值给一个数据属性或 ref 变量 */ }">
- Примечание. Вам необходимо использовать динамическую
:ref
привязку - Когда связанный элемент выгружается, функция также будет вызвана один раз, и первый параметр функции
el
будетnull
ссылка на компонент
Ссылки на шаблоны также можно использовать для подкомпонентов, где ссылка является экземпляром компонента.
Примечание. <script setup>
Используемые по умолчанию являются закрытыми, и родительские компоненты не могут получить доступ <script setup>
к чему-либо в подкомпонентах, использующих , если только подкомпонент не настроен на отображение defineExpose
макроса :
<template>
{
{ name }}
</template>
<script setup lang="ts">
import {
ref } from 'vue';
const name = ref('superman');
defineExpose({
name }); // 暴露数据
</script>
<template>
<HelloWorld ref="helloWorld" />
</template>
<script lang="ts" setup>
import HelloWorld from '@/components/HelloWorld.vue';
import {
ref, onMounted } from 'vue';
const helloWorld = ref();
onMounted(() => {
console.log('helloWorld 暴露出来的 name:', helloWorld.value.name);
});
</script>