Vue3中的ref模板引用的使用

news/2024/11/28 16:27:20/

ref用于对元素的标记,通过ref可以获取到对应元素上的属性和方法。

一、访问模板引用

在Vue3中为了通过组合式 API 获得该模板引用,我们需要声明一个同名的 ref。

<template><div><div ref="element">{{ item }}</div></div>
</template><script setup>
import { ref } from 'vue';
const element=ref(null)
console.log(element);
const item = ref("我是一个元素");
</script><style>
</style>

注意,你只可以在组件挂载后才能访问模板引用。如果你想在模板中的表达式上访问 input,在初次渲染时会是 null。这是因为在初次渲染前这个元素还不存在呢!

如果你需要侦听一个模板引用 ref 的变化,确保考虑到其值为 null 的情况:

<template><div><div ref="element">{{ item }}</div></div>
</template><script setup>
import { ref , watchEffect} from 'vue';
const element=ref(null)
const item = ref("我是一个元素");
watchEffect(()=>{if(element.value){console.log(element);}else{console.log('未加载');}
})
</script><style>
</style>

二、v-for中的模板引用

当在 v-for 中使用模板引用时,对应的 ref 中包含的值是一个数组,它将在元素被挂载后包含对应整个列表的所有元素,需要注意的是,ref 数组并不保证与源数组相同的顺序。

<template><div><div v-for="(item,index) in 10" :key="index" ref="element">{{ item }}</div></div>
</template><script setup>
import { ref , watchEffect} from 'vue';
const element=ref([])
const item = ref("我是一个元素");
watchEffect(()=>{if(element.value){console.log(element);}else{console.log('未加载');}
})
</script><style>
</style>

三、组件上的ref

如果一个子组件使用的是选项式 API 或没有使用 <script setup>,被引用的组件实例和该子组件的 this 完全一致,这意味着父组件对子组件的每一个属性和方法都有完全的访问权。这使得在父组件和子组件之间创建紧密耦合的实现细节变得很容易,当然也因此,应该只在绝对需要时才使用组件引用。大多数情况下,你应该首先使用标准的 props 和 emit 接口来实现父子组件交互。

子组件:

<template><div>{{ data }}</div>
</template><script>
export default {
data(){return{data:'我是子元素'}
}
}
</script><style></style>

父组件:

<template><div><Child ref="child"></Child></div>
</template><script setup>
import Child from "@/components/child.vue"
import { ref, watch ,watchEffect} from "vue"
const child=ref(null)
watchEffect(()=>{if(child.value){console.log(child.value.data);}
})</script><style></style>

有一个例外的情况,使用了 <script setup> 的组件是默认私有的:一个父组件无法访问到一个使用了 <script setup> 的子组件中的任何东西,除非子组件在其中通过 defineExpose 宏显式暴露:

子组件:

<template><div>{{ data }}</div>
</template><script setup>
import { ref } from "vue";const data = ref('我是子元素')
defineExpose({data
})
</script><style></style>

父组件:

<template><div><Child ref="child"></Child></div>
</template><script setup>
import Child from "@/components/child.vue"
import { ref, watch ,watchEffect} from "vue"
const child=ref(null)
watchEffect(()=>{if(child.value){console.log(child.value.data);}
})</script><style></style>


http://www.ppmy.cn/news/39250.html

相关文章

ReentrantLock与synchronized的区别

ReentrantLock与synchronized的区别&#x1f50e;区别1&#x1f50e;区别2&#x1f50e;区别3&#x1f50e;结尾synchronized 基于代码块的方式控制加锁与解锁 ReentrantLock 基于 lock(加锁) 与 unlock(解锁) 方式控制加锁与解锁 &#x1f50e;区别1 synchronized 只是单纯的…

ToBeWritten之ARM汇编基础铺垫

也许每个人出生的时候都以为这世界都是为他一个人而存在的&#xff0c;当他发现自己错的时候&#xff0c;他便开始长大 少走了弯路&#xff0c;也就错过了风景&#xff0c;无论如何&#xff0c;感谢经历 转移发布平台通知&#xff1a;将不再在CSDN博客发布新文章&#xff0c;敬…

chatGPT能生成图片吗-chatGPT如何用

要制作一个ChatGPT中文版的网页&#xff0c;您需要完成以下步骤&#xff1a; 确定技术栈&#xff1a;您需要选择合适的技术栈来进行开发。您可以选择Javascript&#xff0c;HTML和CSS来构建前端界面&#xff0c;使用Node.jsExpress.js来处理后端API的请求&#xff0c;使用Pytho…

【C++】---继承

文章目录继承的概念与定义继承的定义格式父类和子类的对象赋值转换继承中的作用域子类的默认成员函数菱形继承虚拟继承总结继承的概念与定义 继承是面向对象编程三大特性之一&#xff0c;是一种可以使代码复用最重要的手段&#xff0c;在原有类特性的基础上进行扩展&#xff0…

redis 第一章

开始学习redis 之旅吧 关于redis 的介绍 redis 是一个开源的软件&#xff0c;可以存储结构化的数据在内存中&#xff0c;像内存数据库&#xff0c;缓存、消息中间件、流处理引擎。 redis 提供的数据结构像strings, hashes, lists, sets, sorted sets 。Redis具有内置复制、Lua…

中国版的ChatGPT,你最看好谁?

一、百度&#xff1a;文心一言升级中&#xff0c;未来支持开源 3月16日&#xff0c;百度正式推出国内首款生成式AI产品“文心一言”&#xff0c;可支持文学创作、文案创作、数理推算、多模态生成等功能。 “文心一言”基于全栈自研的AI基础设施进行学习和训练&#xff1a; ①…

ChatGPT能够干翻谷歌吗?

目前大多数人对于ChatGPT的喜爱&#xff0c;主要源自于其强大的沟通能力&#xff0c;当我们向ChatGPT提出问题时&#xff0c;它不仅能够为我们提供结论&#xff0c;而且还能够与我们建立沟通&#xff0c;向ChatGPT提出任何问题&#xff0c;感觉都像是在与一个真实的人类进行交谈…

k8s常用软件包下载

离线搭建 Kubernetes 集群需要下载一系列软件的安装包&#xff0c;可以从官网下载&#xff0c;也可以从镜像网站下载&#xff0c;下面提供一些常用软件的下载链接&#xff1a; Docker&#xff1a;https://download.docker.com/linux/static/stable/x86_64/ Kubernetes&#xf…