Skip to content

Vue 3 setup 中取得 DOM 實體的方法

tags: Vue

原理

Vue 在建立實體元件之前會先觸發 setup,所以在 setup 中,是無法存取到 this 實體,會印出 undefined

解決方法

可以用 ref 掛接器 (ref binding) 和 ref 指示詞 (ref directive) 存取 DOM 實體 (像是 options api 的 this.$el), 再使用 onMounted 或是 onMounted 即可

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

<script setup lang="ts">
import { ref, onMounted } from 'vue' 

const inputRef = ref<HTMLInputElement | null>(null) 

// 在 onMounted 裡訪問 DOM 元素
onMounted(() => {
  // 直接訪問 DOM 元素
  inputRef.value?.focus() // 聚焦輸入框
  
  // 獲取/設置值
  console.log(inputRef.value?.value) // 獲取輸入值
  inputRef.value!.value = 'new value' // 設置輸入值
})
</script>

名詞解釋

ref 掛接器 (ref Binding)

  • ref 掛接器 是 Vue 內部的響應式變數,通過 ref() 建立並在 setup 函數或組件的生命週期中使用
  • 它通常用於引用組件或 DOM 元素,並能直接操作它們
vue
import { ref } from 'vue'

// 建立原始值的響應式引用
const count = ref(0)
const message = ref('Hello')

// 建立 DOM 引用
const inputRef = ref<HTMLInputElement | null>(null)

ref 指示詞 (ref Directive)

  • ref 指示詞 是 Vue 模板中用來將 DOM 元素或組件綁定到 ref 變數的指令
  • 它將模板中的某個元素或組件的引用賦值給 ref(),並且你可以在 setup 中通過該變數訪問元素或組件
vue
<template>
  <!-- DOM 元素引用 -->
  <input ref="inputRef" />
  
  <!-- 組件引用 -->
  <ChildComponent ref="childRef" />
</template>
特性ref 掛接器 (ref Binding)ref 指示詞 (ref Directive)
用途setup 函數內創建和操作響應式的引用在模板中綁定 DOM 元素或組件,並使其可用於 ref 變數
作用範圍用於 JavaScript 層面,通過 ref() 創建響應式引用用於模板層面,將 DOM 或組件的引用綁定到 ref
設置位置setup 函數中創建,並使用 ref() 訪問在模板中的元素或組件上使用 ref 指示詞綁定
功能提供一個可響應的引用,便於訪問 DOM 或組件實例將元素的引用綁定到 JavaScript 中的變數(如 inputRef

參考資料