首页 > 其他分享 >学习VUE3——模板引用ref

学习VUE3——模板引用ref

时间:2024-05-29 17:08:01浏览次数:27  
标签:const 元素 引用 VUE3 组件 ref 模板

在某些情况下,我们仍然需要直接访问底层 DOM 元素。要实现这一点,我们可以使用特殊的 ref attribute:

<input ref="input">

ref 是一个特殊的 attribute,和 v-for 章节中提到的 key 类似。它允许我们在一个特定的 DOM 元素或子组件实例被挂载后,获得对它的直接引用。这可能很有用,比如说在组件挂载时将焦点设置到一个 input 元素上,或在一个元素上初始化一个第三方库

例子:

<script setup>
import { ref, onMounted } from 'vue'

// 声明一个 ref 来存放该元素的引用
// 必须和模板里的 ref 同名
const input = ref(null)

onMounted(() => {
  input.value.focus()
})
</script>

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

注意,你只可以在组件挂载后才能访问模板引用。

在v-for中的模板引用(v3.2.25 及以上版本支持)

当在 v-for 中使用模板引用时,对应的 ref 中包含的值是一个数组,它将在元素被挂载后包含对应整个列表的所有元素:

<script setup>
import { ref, onMounted } from 'vue'

const list = ref([1, 2, 3])

const itemRefs = ref([])

onMounted(() => {
  console.log(itemRefs.value.map(i => i.textContent))
  // [1, 2, 3]
})
</script>

<template>
  <ul>
    <li v-for="item in list" ref="itemRefs">
      {{ item }}
    </li>
  </ul>
</template>

注意:ref 数组并不保证与源数组相同的顺序。

函数模板引用

除了使用字符串值作名字,ref attribute 还可以绑定为一个函数,会在每次组件更新时都被调用。该函数会收到元素引用作为其第一个参数:

<input :ref="(el) => { /* 将 el 赋值给一个数据属性或 ref 变量 */ }">

注意:我们这里需要使用动态的 :ref 绑定才能够传入一个函数。当绑定的元素被卸载时,函数也会被调用一次,此时的 el 参数会是 null

组件上的ref

假设有一个父子嵌套组件,如果子组件使用的是选项式 API没有使用 <script setup>,被引用的组件实例和该子组件的 this 完全一致,这意味着父组件对子组件的每一个属性和方法都有完全的访问权。即父组件可以通过ref获得子组件组件实例,然后子组件内的所有方法和属性都可以访问。

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

<script setup>
import { ref } from 'vue'

const a = 1
const b = ref(2)
// 像 defineExpose 这样的编译器宏不需要导入
defineExpose({
  a,
  b
})
</script>

当父组件通过模板引用获取到了该组件的实例时,得到的实例类型为 { a: number, b: number } (ref 都会自动解包,和一般的实例一样)。

标签:const,元素,引用,VUE3,组件,ref,模板
From: https://blog.csdn.net/lss_033_lss/article/details/139295889

相关文章

  • 【模板】分裂合并 WBLT(自用)
    #include<bits/stdc++.h>usingnamespacestd;#ifdefLOCAL#definedebug(...)fprintf(stderr,__VA_ARGS__)#else#defineendl"\n"#definedebug(...)void(0)#endifusingLL=longlong;template<intN>structwblt{intch[N<......
  • vue3项目使用pinia状态管理器----通俗易懂
    1、首先安装piniayarnaddpinia#或使用npmnpminstallpinia2、在项目的src目录下新建store文件夹,然后store目录下新建index.js/index.ts:我这里是index,jsimport{createPinia}from"pinia"//创建Pinia实例constpinia=createPinia()//导出Pinia......
  • vue3 组件的动态渲染 <component :is=“componentTag“ />
    1、动态渲染组件        <component:is=""></component>        通过isShow来切换显示A、B组件首先创建父组件.vue文件和两个子组件A、B文件,并引入。template:<div><h3>我是父组件dynamicComp.vue</h3><button@click="isShow=!isShow">切换......
  • 干货收藏!Calico的BGP RouteReflector策略实践
    本文分享自华为云社区《CalicoBGPRouteReflector策略实践》,作者:可以交个朋友。一背景容器网络组件Calico支持多种后端模式,有Overlay的IPIP、Vxlan模式,也有Underlay纯路由的BGP模式。相比于Overlay网络模型,Underlay网络具有更高的数据面转发性能。同时在纯路由模式下,也有两种......
  • vue3 表单输入绑定
    表单输入绑定在前端处理表单时,我们常常需要将表单输入框的内容同步给JavaScript中相应的变量。手动连接值绑定和更改事件监听器可能会很麻烦:<input:value="text"@input="event=>text=event.target.value">v-model指令帮我们简化了这一步骤:<inputv-model=......
  • vue3响应式基础
    声明响应式状态​ref()​在组合式API中,推荐使用ref()函数来声明响应式状态:import{ref}from"vue";constmsg=ref("helloworld");ref()接收参数,并将其包裹在一个带有.value属性的ref对象中返回:<template><div>{{msg}}</div></template><scri......
  • c++ 设计模板
     ========一、设计模式的分类总体来说设计模式分为三大类创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板......
  • 解决Odoo Email模板中的时间与实际时间相差8小时的问题
     要解决OdooEmail模板中的时间与实际时间相差8小时的问题,最好的方法是先在服务器端处理时间,然后在模板中调用处理后的时间。在你的截图中,直接在模板中使用了`datetime.datetime.now()`,这会导致时区问题。以下是详细步骤:###1.在模型中添加一个方法来处理时区转换在你的模......
  • 【Nginx】Referer配置
    server配置server{listen80;server_namelocalhost;add_headerX-Frame-OptionsSAMEORIGIN;add_headerReferer-Policyorigin;add_headerContent-Security-Policy"frame-ancestors'self'";add_headerX-Permi......
  • k8s:The connection to the server localhost:8080 was refused - did you specify the
    前言k8s集群node节点报错:Theconnectiontotheserverlocalhost:8080wasrefused-didyouspecifytherighthostorport?通过kubectlgetnodes查看集群的情况,出现了报错,内容如下:$kubectlgetpodE052902:28:59.776677415799memcache.go:265]couldn'tgetc......