一文详解Vue3中使用ref获取元素节点

目录
  • 静态绑定
    • onMounted
    • nextTick
    • watchEffect
    • watch
  • v-for中使用
  • 动态绑定
  • ref设置函数
  • 通过getCurrentInstance方法
  • 获取vue实例

前言:

本文介绍在vue3setup中使用composition API获取元素节点的几种方法:

静态绑定

仅仅需要申明一个ref的引用,用来保存元素,在template中,不必bind引用(:ref="domRef"),只需要声明一个同名的ref属性(ref="domRef")即可。

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

// 声明一个ref引用,来保存元素
const domRef = ref(null)

onMounted(() => {
  domRef.value.style.background = "red"
})
</script>

<template>
  <!-- 这里只需要同名即可 -->
  <button ref="domRef">dom</button>
</template>

需要注意的是,访问的时候,要确保ref引用值已经成功绑定上元素,我们可以使用以下几种方式确保获取:

onMounted

onMounted(() => {
  domRef.value.style.background = "red"
})

nextTick

nextTick(() => {
  domRef.value.style.background = "red"
})

watchEffect

watchEffect(() => {
   if (domRef.value) {
        domRef.value.style.background = "red"
   }
})

watch

watch(domRef, (val) => {
    domRef.value.style.background = "red"
})

v-for中使用

在使用v-for进行静态绑定时,仅需要注意以下两点:

  • 要与v-for在同级
  • ref是一个数组ref([])
<script setup>
import { ref, onMounted } from 'vue'

const list = ref([
  /* ... */
])

const itemRefs = ref([])

onMounted(() => console.log(itemRefs.value))
</script>

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

但需要注意的是,itemRefs元素数组并不保证与list数组为相同的顺序。

动态绑定

动态绑定中,分为两种方式,一种是通过将ref设置为函数,第二种则是通过getCurrentInstance方法访问当前组件实例上的$refs

ref设置函数

<template>
    <button :ref="handleRef">动态Ref</button>
</template>
<script setup>
    import { shallowRef } from 'vue'
    
    const btnRef = shallowRef(null)
    // 赋值动态ref到变量
    const handleRef = el => {
        if (el) {
            btnRef.value = el
        }
    }
</script>

ref的函数回调中,我们能够接受到元素返回值,再动态设置到响应式变量即可;

当然,通过设置函数回调的方式,我们也能非常灵活的进行进一步的封装。

<template>
    <ul>
        <li v-for="item in list" :key="item.id" :ref="(el) => handleLiRef(el, item)">
            <button>{{ item.id }}</button>
        </li>
    </ul>
</template>

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

    const list = ref([{ id: "111" }, { id: "222" }, { id: "333" }])

    const handleLiRef = (el, item) => {
        console.log(el, item)
    }
</script>

通过getCurrentInstance方法

<template>
    <ul>
        <li v-for="item in list" :key="item.id" :ref="item.id">
            <button>{{ item.id }}</button>
        </li>
    </ul>
</template>
<script setup>
    import { getCurrentInstance, onMounted, ref } from "vue"

    const { proxy } = getCurrentInstance()

    const list = ref([{ id: "111" }, { id: "222" }, { id: "333" }])
    onMounted(() => {
        console.log(proxy.$refs["111"])
    })
</script>

这种方式,与vue2this.$refs一般无二,只是我们用了getCurrentInstance函数在setup中获取了当前组件实例以替代this

获取vue实例

需要注意的是,无论通过以上哪种方式获取元素,如果元素为vue组件,则需要在子组件中使用defineExpose进行暴露。

在父组件中,我们静态绑定childRef

<template>
    <Test ref="childRef"></Test>
</template>

<script setup lang="ts">
    import Test from "./components/test.vue"
    import { onMounted, ref } from "vue"

    const childRef = ref(null)
    onMounted(() => {
        console.log(childRef.value.btnRef)
    })
</script>

在子组件中,我们需要通过defineExpose函数,手动暴露出来ref引用值,该值指向了button元素。

<template>
    <button ref="btnRef">子组件</button>
</template>
<script setup>
    import { ref } from "vue"
    const btnRef = ref(null)
    defineExpose({
        btnRef
    })
</script>

到此这篇关于一文详解Vue3中使用ref获取元素节点的文章就介绍到这了,更多相关Vue3 ref 获取元素节点内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • vue3如何使用ref获取元素

    目录 vue3使用ref获取元素 vue3中ref的理解 1.什么是ref? 2.ref本质 3.ref注意点 4.ref获取元素 vue3使用ref获取元素 在vue2.x中,可以通过给元素添加ref='xxx'属性,然后在代码中通过this.$refs.xxx获取到对应的元素 然而在vue3中时没有$refs这个东西的,因此vue3中通过ref属性获取元素就不能按照vue2的方式来获取 vue3需要借助生命周期方法,原因很简单,在setup执行时,template中的元素还没挂载到页面上,所

  • vue基本使用--refs获取组件或元素的实例

    说明:vm.$refs 一个对象,持有已注册过 ref 的所有子组件(或HTML元素) 使用:在 HTML元素 中,添加ref属性,然后在JS中通过vm.$refs.属性来获取 注意:如果获取的是一个子组件,那么通过ref就能获取到子组件中的data和methods 添加ref属性 <div id="app"> <h1 ref="h1Ele">这是H1</h1> <hello ref="ho">&l

  • 一文详解Vue3中使用ref获取元素节点

    目录 静态绑定 onMounted nextTick watchEffect watch v-for中使用 动态绑定 ref设置函数 通过getCurrentInstance方法 获取vue实例 前言: 本文介绍在vue3的setup中使用composition API获取元素节点的几种方法: 静态绑定 仅仅需要申明一个ref的引用,用来保存元素,在template中,不必bind引用(:ref="domRef"),只需要声明一个同名的ref属性(ref="domRef&qu

  • vue3中通过ref获取元素节点的实现

    目录 通过ref获取元素节点 获取ref元素的几种方式小结 1. 原生js获取dom元素 2. ref获取单个dom元素 3. ref获取v-for循环中的dom元素 4. 在swiper中获取swiper的dom元素 通过ref获取元素节点 ref 在vue2中可以说简化js原生的document.getElementById("#id")操作 .当然在vue3中也一样 首先,给你想获取到的元素一个ref 属性 然后,再将这个ref对象创建出来,就可以访问到他的值 但是.这样在set

  • 一文详解Vue3中简单diff算法的实现

    目录 简单Diff算法 减少DOM操作 例子 结论 实现 DOM复用与key的作用 例子 虚拟节点的key 实现 找到需要移动的元素 探索节点顺序关系 实现 如何移动元素 例子 实现 添加新元素 例子 实现 移除不存在的元素 例子 实现 总结 简单Diff算法 核心Diff只关心新旧虚拟节点都存在一组子节点的情况 减少DOM操作 例子 // 旧节点 const oldVNode = { type: 'div', children: [ { type: 'p', children: '1' },

  • 一篇文章搞懂Vue3中如何使用ref获取元素节点

    目录 前言 1.回顾 Vue2 中的 ref 2.Vue3 中 ref 访问元素 3.v-for 中使用 ref 4.ref 绑定函数 5.组件上使用 ref 总结 前言 虽然在 Vue 中不提倡我们直接操作 DOM,毕竟 Vue 的理念是以数据驱动视图.但是在实际情况中,我们有很多需求都是需要直接操作 DOM 节点的,这个时候 Vue 提供了一种方式让我们可以获取 DOM 节点:ref 属性.ref 属性是 Vue2 和 Vue3 中都有的,但是使用方式却不大一样,这也导致了很多从 Vue2

  • 详解vue3中如何使用shaka-player

    目录 正文 开始使用 做成组件shakaPlayer 使用方式 注意事项 正文 Shaka Player 是谷歌公司对外开源的一款 JavaScript 类库,详细请看谷歌官方API文档. 开始使用 我们可以使用 npm 下载 npm i shaka-player 做成组件shakaPlayer <script setup> import { ref, watch, onMounted, onBeforeUnmount } from "vue"; import shaka

  • 详解Vue3中Teleport的使用

    在本文中,我们将介绍: Teleport 的目的 Teleport 的例子 一些很有意思的代码交互 Teleport 的目的 首先是什么时候以及使用这个 Teleport 功能. 在开发较大的 Vue 项目时应该以可重用的逻辑去组织代码.但是当处理某些类型的组件(如模式.通知或工具提示)时,模板 HTML 的逻辑可能不会和我们希望渲染元素处于相同的文件中. 实际上在大多数情况下,与 Vue 的 DOM 完全分开处理相比,处理这些元素要容易得多.因为嵌套组件的位置.z-index 和样式等这些东西

  • 一文详解Vue3响应式原理

    目录 回顾 vue2.x 的响应式 vue3的响应式 Reflect 回顾 vue2.x 的响应式 实现原理: 对象类型:通过object.defineProperty()对属性的读取.修改进行拦截(数据劫持) 数组类型:通过重写更新数组的一系列方法来实现拦截(对数组的变更方法进行了包裹) Object.defineProperty(data,'count ",{ get(){}, set(){} }) 存在问题: 新增属性.删除属性,界面不会更新 直接通过下标修改数组,界面不会自动更新 但是

  • 详解vue3中如何使用youtube-player

    目录 正文 开始使用 做成组件youtubePlayer 使用方式 注意事项 常用参数 常用API 正文 youtube-player 是 YouTube IFrame Player API (YIPA) 的封装.可以在自己网站上播放YouTube视频. 开始使用 使用 npm 下载 npm i youtube-player 做成组件youtubePlayer <script setup> import { ref, watch, onMounted, onBeforeUnmount } fr

  • 详解Vue3中对VDOM的改进

    前言 vue-next 对virtual dom的patch更新做了一系列的优化,从编译时加入了 block 以减少 vdom 之间的对比次数,另外还有 hoisted 的操作减少了内存的开销.本文写给自己看,做个知识点记录,如有错误,还请不吝赐教. VDOM VDOM的概念简单来说就是用js对象来模拟真实DOM树.由于MV**的架构,真实DOM树应该随着数据(Vue2.x中的data)的改变而发生改变,这些改变可能是以下几个方面: v-if v-for 动态的props(如:class,@cl

  • 详解vue3中组件的非兼容变更

    函数式组件 functional attribute 在单文件组件 (SFC) <template> 已被移除 { functional: true } 选项在通过函数创建组件已被移除 // 使用 <dynamic-heading> 组件,负责提供适当的标题 (即:h1,h2,h3,等等),在 2.x 中,这可能是作为单个文件组件编写的: // Vue 2 函数式组件示例 export default { functional: true, props: ['level'], re

随机推荐