Komponentenregistrierung


Auf dieser Seite wird davon ausgegangen, dass Sie Komponentengrundlagen gelesen haben. Wenn Sie noch nicht viel über Komponenten wissen, empfehle ich Ihnen, es zuerst zu lesen.


Inhaltsverzeichnis


Komponentenname


Registrieren einer Komponente, Wir müssen ihm immer einen Namen geben. Wir haben es zum Beispiel bei der globalen Registrierung gesehen:

Vue.component('my-component-name', { /* ... */ })

Der Komponentenname ist der erste Parameter von Vue.component.

Der Name, den Sie Ihrer Komponente geben, hängt möglicherweise davon ab, wofür Sie sie verwenden möchten. Wenn Sie eine Komponente direkt im DOM verwenden (und nicht in einer Zeichenfolgenvorlage oder Einzeldateikomponente), empfehlen wir dringend, die W3C-Spezifikation für benutzerdefinierte Komponentennamen zu befolgen (alle Buchstaben müssen in Kleinbuchstaben geschrieben werden). einen Bindestrich enthalten). Dies hilft Ihnen, Konflikte mit aktuellen und zukünftigen HTML-Elementen zu vermeiden.

Weitere Vorschläge für Komponentennamen finden Sie im Style Guide.


Groß-/Kleinschreibung des Komponentennamens

Es gibt zwei Möglichkeiten, einen Komponentennamen zu definieren:

Verwenden kebab-case

Vue.component('my-component-name', { /* ... */ })

Wenn Sie eine Komponente mit kebab-case (durch Bindestriche getrennte Namen) definieren, müssen Sie kebab-case auch verwenden, wenn Sie auf das benutzerdefinierte Element verweisen, z. B. <my-component-name>.

Verwenden Sie PascalCase

Vue.component('MyComponentName', { /* ... */ })

Wenn Sie eine Komponente mit PascalCase definieren (Benennung in Großbuchstaben), können Sie beim Verweisen auf das benutzerdefinierte Element eine der beiden Nomenklaturen verwenden. Das bedeutet, dass sowohl <my-component-name> als auch <MyComponentName> akzeptabel sind. Beachten Sie jedoch, dass nur kebab-case gültig ist, wenn es direkt im DOM verwendet wird (d. h. Nicht-String-Vorlagen).


Globale Registrierung


Bisher haben wir Vue.component nur zum Erstellen von Komponenten verwendet:

Vue.component('my-component-name', {
  // ... 选项 ...
})

Diese Komponenten sind weltweit registriert. Das bedeutet, dass sie nach der Registrierung im Template jeder neu erstellten Vue-Root-Instanz (new Vue) verwendet werden können. Zum Beispiel:

Vue.component('component-a', { /* ... */ })
Vue.component('component-b', { /* ... */ })
Vue.component('component-c', { /* ... */ })

new Vue({ el: '#app' })
<div id="app">
  <component-a></component-a>
  <component-b></component-b>
  <component-c></component-c>
</div>

Das Gleiche gilt für alle Unterkomponenten, das heißt, diese drei Komponenten können sich auch intern gegenseitig nutzen.


Lokale Registrierung


Eine globale Registrierung ist oft nicht ideal. Wenn Sie beispielsweise ein Build-System wie Webpack verwenden, bedeutet die globale Registrierung aller Komponenten, dass eine Komponente auch dann in Ihrem endgültigen Build-Ergebnis enthalten ist, wenn Sie sie nicht mehr verwenden. Dies führt zu einem unnötigen Anstieg der Menge an JavaScript, die von Benutzern heruntergeladen wird.

In diesen Fällen können Sie die Komponente über ein einfaches JavaScript-Objekt definieren:

var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
var ComponentC = { /* ... */ }

und dann die Komponente, die Sie verwenden möchten, in der Option components definieren:

new Vue({
  el: '#app',
  components: {
    'component-a': ComponentA,
    'component-b': ComponentB
  }
})

Für jedes Attribut im components-Objekt ist sein Attributname der Name des benutzerdefinierten Elements und sein Attributwert ist das Optionsobjekt dieser Komponente.

Hinweis: Teilweise registrierte Komponenten sind nicht verfügbar in ihren untergeordneten Komponenten. Wenn Sie beispielsweise möchten, dass ComponentA innerhalb von ComponentB verfügbar ist, schreiben Sie:

var ComponentA = { /* ... */ }

var ComponentB = {
  components: {
    'component-a': ComponentA
  },
  // ...
}

. Wenn Sie ES2015-Module über Babel und Webpack verwenden, sieht der Code eher wie folgt aus:

import ComponentA from './ComponentA.vue'

export default {
  components: {
    ComponentA
  },
  // ...
}

Beachten Sie, dass in ES2015 das Einfügen eines Variablennamens wie ComponentA in ein Objekt tatsächlich zulässig ist ComponentA: ComponentA Die Abkürzung für diesen Variablennamen lautet auch:

  • Der Name des in der Vorlage verwendeten benutzerdefinierten Elements

  • enthält diese Komponente Variablennamen für Optionen


Modulsystem


Wenn Sie fehlgeschlagen import/require Wenn Sie ein Modulsystem verwenden, überspringen Sie dieses Kapitel vielleicht vorerst. Wenn Sie es verwenden, stellen wir Ihnen einige besondere Anweisungen und Vorsichtsmaßnahmen zur Verfügung.


Lokale Anmeldung im Modulsystem

Wenn Sie noch lesen, bedeutet das Sie haben Modulsysteme wie Babel und Webpack verwendet. In diesen Fällen empfehlen wir, ein components-Verzeichnis zu erstellen und jede Komponente in einer eigenen Datei abzulegen.

Dann müssen Sie jede Komponente, die Sie verwenden möchten, importieren, bevor Sie sie lokal registrieren. Zum Beispiel in einer hypothetischen ComponentB.js- oder ComponentB.vue-Datei:

import ComponentA from './ComponentA'
import ComponentC from './ComponentC'

export default {
  components: {
    ComponentA,
    ComponentC
  },
  // ...
}

Jetzt können sowohl ComponentA als auch ComponentC in der Vorlage von ComponentB verwendet werden.


Automatisierte globale Registrierung grundlegender Komponenten

Vielleicht umschließen viele Ihrer Komponenten einfach Elemente wie Eingabefelder oder Schaltflächen, die relativ universell sind. Wir nennen sie manchmal Grundkomponenten und sie werden häufig in verschiedenen Komponenten verwendet.

So viele Komponenten werden eine lange Liste von Grundkomponenten haben:

import BaseButton from './BaseButton.vue'
import BaseIcon from './BaseIcon.vue'
import BaseInput from './BaseInput.vue'

export default {
  components: {
    BaseButton,
    BaseIcon,
    BaseInput
  }
}

, aber nur für einen kleinen Teil der Vorlage:

<BaseInput
  v-model="searchText"
  @keydown.enter="search"
/>
<BaseButton @click="search">
  <BaseIcon name="search"/>
</BaseButton>

Glücklicherweise, wenn Sie Webpack verwenden (oder Vue CLI 3 , das Webpack intern verwendet), dann können Sie require.context verwenden Nur diese sehr häufig vorkommenden Grundkomponenten sind weltweit registriert. Hier ist ein Beispielcode, mit dem Sie grundlegende Komponenten in der Anwendungseintragsdatei (z. B. src/main.js) global importieren können:

import Vue from 'vue'
import upperFirst from 'lodash/upperFirst'
import camelCase from 'lodash/camelCase'

const requireComponent = require.context(
  // 其组件目录的相对路径
  './components',
  // 是否查询其子目录
  false,
  // 匹配基础组件文件名的正则表达式
  /Base[A-Z]\w+\.(vue|js)$/
)

requireComponent.keys().forEach(fileName => {
  // 获取组件配置
  const componentConfig = requireComponent(fileName)
  // 获取组件的 PascalCase 命名
  const componentName = upperFirst(
    camelCase(
      // 获取和目录深度无关的文件名
      fileName
        .split('/')
        .pop()
        .replace(/\.\w+$/, '')
    )
  )
  
  // 全局注册组件
  Vue.component(
    componentName,
    // 如果这个组件选项是通过 `export default` 导出的,
    // 那么就会优先使用 `.default`,
    // 否则回退到使用模块的根。
    componentConfig.default || componentConfig
  )
})

Denken Sie daran Global registrierte Verhaltensweisen müssen sich in der Root-Vue-Instanz befinden (über new Vue ) tritt auf, bevor erstellt wird. Hier ist ein Beispiel für ein reales Projektszenario.