Vue3 中关于 ref 需要知道的操作

1,493 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 5 天,点击查看活动详情

在 Vue 中,ref 用于注册元素或子组件的引用

对于 ref$refs 的常规操作,想必大家都有所了解,在 Vue2 中,或者说 在 非 setup 钩子中, 绑定了 ref 属性的组件可以通过 this.$refs 来获取指定元素(组件实例)。

比如,在如下是 form 表单中绑定了 ref 属性,this.$refs 会保存已注册过 ref 的所有子组件。我们在组件挂载后对它进行访问。

<form ref="ruleForm"></form>

console.log(this.$refs)

打开控制台可以看到输出结果:

image.png

注:

  • ref 如果是绑定在普通的元素上,this.$refs.元素名称 可以获取到 DOM 元素
  • $refs 是非响应式的
  • 在组件挂载后才可以进行访问

Vue3 中获取

在· Vue3 中,无论是使用 setup 语法糖,还是使用 setup() 钩子函数,都是没有 this 的。

组合式 API 的实现方式:

<div ref="myRef">hello</div>

import { ref } from 'vue'
const a = ref()

ref 的参数类型是 string | Function,所以除上述使用方法之外,ref 还可以绑定函数,以及在 v-for 循环中获取多个组件实例:

ref 可以绑定函数

当 ref 绑定的是函数,需要注意是带有冒号的 :ref。函数接口一个默认参数,通过获取到的 el 实例来使用里面的属性或者方法。

代码如下:

<a-form :ref="getTitleRefs"></a-form>

getTitleRefs(el: any) {
  console.log(el);
}

运行结果:

获取多个 ref

当有多个组件动态渲染时,可以通过绑定函数来获取全部实例,并存储在一个数组中,方便后续的操作。

其中增加了一步判断 el 是否存在的步骤,目的是为了添加全部实例,并且不重复添加,当节点个数放生变化,得到的整个数组也可以获取到全部的数据。

<form v-for="(item, index) in formList" :ref="(el: any) => { setRef(el, index)}">
</form>

const setRef = (el: any, index: number) => { 
    if (el) { 
        refList['ref' + index] = el 
    } 
}

运行结果如下,通过 key 值即可找到对应的数据

image.png