直接跳到內容

組件實例

INFO

本頁文檔描述了組件公共實例 (即 this) 上暴露的內置屬性和方法,

本頁羅列的所有屬性,除 $data 下的嵌套屬性之外,都是只讀的。

$data

data 選項函數中返回的對象,會被組件賦為響應式。組件實例將會代理對其數據對象的屬性訪問。

  • 類型

    ts
    interface ComponentPublicInstance {  $data: object }

$props

表示組件當前已解析的 props 對象。

  • 類型

    ts
    interface ComponentPublicInstance {  $props: object }
  • 詳細信息

    這裡只包含通過 props 選項聲明的 props。組件實例將會代理對其 props 對象上屬性的訪問。

$el

該組件實例管理的 DOM 根節點。

  • 類型

    ts
    interface ComponentPublicInstance {  $el: Node | undefined }
  • 詳細信息

    $el 直到組件掛載完成 (mounted) 之前都會是 undefined

    • 對於單一根元素的組件,$el 將會指向該根元素。
    • 對於以文本節點為根的組件,$el 將會指向該文本節點。
    • 對於以多個元素為根的組件,$el 將是一個僅作佔位符的 DOM 節點,Vue 使用它來跟蹤組件在 DOM 中的位置 (文本節點或 SSR 激活模式下的註釋節點)。

    TIP

    為保持一致性,我們推薦使用模板引用來直接訪問元素而不是依賴 $el

$options

已解析的用於實例化當前組件的組件選項。

  • 類型

    ts
    interface ComponentPublicInstance {  $options: ComponentOptions }
  • 詳細信息

    這個 $options 對象暴露了當前組件的已解析選項,並且會是以下幾種可能來源的合併結果:

    • 全局 mixin
    • 組件 extends 的基組件
    • 組件級 mixin

    它通常用於支持自定義組件選項:

    js
    const app = createApp({  customOption: 'foo',  created() {  console.log(this.$options.customOption) // => 'foo'  } })
  • 參考 app.config.optionMergeStrategies

$parent

當前組件可能存在的父組件實例,如果當前組件是頂層組件,則為 null

  • 類型

    ts
    interface ComponentPublicInstance {  $parent: ComponentPublicInstance | null }

$root

當前組件樹的根組件實例。如果當前實例沒有父組件,那麼這個值就是它自己。

  • 類型

    ts
    interface ComponentPublicInstance {  $root: ComponentPublicInstance }

$slots

一個表示父組件所傳入插槽的對象。

  • 類型

    ts
    interface ComponentPublicInstance {  $slots: { [name: string]: Slot } }  type Slot = (...args: any[]) => VNode[]
  • 詳細信息

    通常用於手寫渲染函數,但也可用於檢測是否存在插槽。

    每一個插槽都在 this.$slots 上暴露為一個函數,返回一個 vnode 數組,同時 key 名對應著插槽名。默認插槽暴露為 this.$slots.default

    如果插槽是一個作用域插槽,傳遞給該插槽函數的參數可以作為插槽的 prop 提供給插槽。

  • 參考渲染函數 - 渲染插槽

$refs

一個包含 DOM 元素和組件實例的對象,通過模板引用註冊。

$attrs

一個包含了組件所有透傳屬性的對象。

  • 類型

    ts
    interface ComponentPublicInstance {  $attrs: object }
  • 詳細信息

    透傳 Attributes 是指由父組件傳入,且沒有被子組件聲明為 props 或是組件自定義事件的 attributes 和事件處理函數。

    默認情況下,若是單一根節點組件,$attrs 中的所有屬性都是直接自動繼承自組件的根元素。而多根節點組件則不會如此,同時你也可以通過配置 inheritAttrs 選項來顯式地關閉該行為。

  • 參考

$watch()

用於命令式地創建偵聽器的 API。

  • 類型

    ts
    interface ComponentPublicInstance {  $watch(  source: string | (() => any),  callback: WatchCallback,  options?: WatchOptions  ): StopHandle }  type WatchCallback<T> = (  value: T,  oldValue: T,  onCleanup: (cleanupFn: () => void) => void ) => void  interface WatchOptions {  immediate?: boolean // default: false  deep?: boolean // default: false  flush?: 'pre' | 'post' | 'sync' // default: 'pre'  onTrack?: (event: DebuggerEvent) => void  onTrigger?: (event: DebuggerEvent) => void }  type StopHandle = () => void
  • 詳細信息

    第一個參數是監視源。它可以是一個組件屬性名稱字符串、一個簡單的以點分隔的路徑字符串或一個 getter 函數

    第二個參數是回調函數。回調函數接收被監視源的新值和舊值。

    • immediate:在創建監視器時立即觸發回調。在第一次調用時,舊值將為 undefined
    • deep:如果源是對象,則強制對其進行深度遍歷,以便在深度突變時觸發回調。請參閱深度觀察者
    • flush:調整回調的刷新時序。請參閱 Callback Flush TimingwatchEffect()
    • onTrack / onTrigger:調試觀察者的依賴關係。請參閱監視器調試
  • 示例

    偵聽一個屬性名:

    js
    this.$watch('a', (newVal, oldVal) => {})

    偵聽一個由 . 分隔的路徑:

    js
    this.$watch('a.b', (newVal, oldVal) => {})

    對更復雜表達式使用 getter 函數:

    js
    this.$watch(  // 每一次這個 `this.a + this.b` 表達式生成一個  // 不同的結果,處理函數都會被調用  // 這就好像我們在偵聽一個計算屬性  // 而不定義計算屬性本身。  () => this.a + this.b,  (newVal, oldVal) => {} )

    停止該偵聽器:

    js
    const unwatch = this.$watch('a', cb)  // 之後…… unwatch()
  • 參考

$emit()

在當前組件觸發一個自定義事件。任何額外的參數都會傳遞給事件監聽器的回調函數。

  • 類型

    ts
    interface ComponentPublicInstance {  $emit(event: string, ...args: any[]): void }
  • 示例

    js
    export default {  created() {  // 僅觸發事件  this.$emit('foo')  // 帶有額外的參數  this.$emit('bar', 1, 2, 3)  } }
  • 參考

$forceUpdate()

強制該組件重新渲染。

  • 類型

    ts
    interface ComponentPublicInstance {  $forceUpdate(): void }
  • 詳細信息

    鑑於 Vue 的全自動響應性系統,這個功能應該很少會被用到。唯一可能需要它的情況是,你使用高階響應式 API 顯式創建了一個非響應式的組件狀態。

$nextTick()

綁定在實例上的 nextTick() 函數。

  • 類型

    ts
    interface ComponentPublicInstance {  $nextTick(callback?: (this: ComponentPublicInstance) => void): Promise<void> }
  • 詳細信息

    和全局版本的 nextTick() 的唯一區別就是組件傳遞給 this.$nextTick() 的回調函數會帶上 this 上下文,其綁定了當前組件實例。

  • 參考 nextTick()

組件實例已經加載完畢