返回

Vue 3 中 ref 的神奇世界:从 setup 钩子中掌控元素引用

前端

序幕:告别 this.$refs,拥抱 ref()

在 Vue.js 的世界中,我们习惯了通过 this.refs 来获取对组件内元素的引用,这种方式在非 setup 钩子中屡试不爽。然而,当我们踏入 setup 钩子的领域,this.refs 却神秘地消失了。这不禁让人困惑:如何在 setup 中掌控元素引用?

登场:ref() API,你的元素引用向导

答案就在 ref() API 中,它是一个神奇的工具,专为 setup 钩子中的元素引用而生。ref() 接受一个可变对象作为参数,每当指向该对象的元素发生变化时,该对象都会被更新。这为我们打开了一扇大门,让我们可以在 setup 中轻松获取元素引用。

初探:一个简单的示例

让我们通过一个简单的示例来揭开 ref() API 的神秘面纱:

import { ref } from 'vue'

export default {
  setup() {
    const myRef = ref(null) // 创建一个可变对象来存储元素引用

    return {
      myRef, // 将 myRef 暴露给模板
    }
  },
  template: `<input ref="myRef" />`, // 在模板中使用 ref() 设置元素引用
}

在这个示例中,我们使用 ref() 创建了一个名为 myRef 的可变对象,并将它暴露给模板。当用户与 input 元素交互时,该可变对象将自动更新,持有 input 元素的引用。

进阶:动态设置 ref

ref() API 还不止于此,它还支持动态设置 ref,让我们可以根据特定条件灵活地绑定元素引用。例如:

import { ref } from 'vue'

export default {
  setup() {
    const showInput = ref(true) // 用于控制 input 元素是否显示

    const myRef = computed(() => {
      return showInput.value ? ref(null) : null // 根据 showInput 的值动态设置 ref
    })

    return {
      myRef,
      showInput,
    }
  },
  template: `<input v-if="showInput" ref="myRef" />`,
}

在上面的示例中,我们根据 showInput 的值动态设置 myRef 的引用。当 showInput 为真时,myRef 将指向 input 元素;当 showInput 为假时,myRef 将被置为 null。

妙用:DOM 操作和响应式交互

掌握了 ref() API 的精髓,我们便能随心所欲地操纵 DOM 元素,并实现响应式的交互体验。例如:

import { ref } from 'vue'

export default {
  setup() {
    const inputRef = ref(null) // 获取 input 元素的引用

    const focusInput = () => {
      inputRef.value?.focus() // 使用 ref().value 访问元素并调用 focus() 方法
    }

    return {
      inputRef,
      focusInput,
    }
  },
  template: `<input ref="inputRef" />`,
}

在这个示例中,我们使用 ref() 获取 input 元素的引用,并定义了一个 focusInput() 方法来触发 input 元素的 focus() 方法。当我们调用 focusInput() 方法时,input 元素将获得焦点。

结语:掌握元素引用,掌控交互世界

通过揭开 Vue 3 中 ref() API 的神秘面纱,我们获得了在 setup 钩子中掌控元素引用的超能力。从动态设置 ref 到巧妙的 DOM 操作和响应式交互,ref() API 为我们打开了无限的可能性。让我们尽情挥洒创意,构建出更加灵动和用户友好的 Web 应用吧!