Pendaftaran komponen


Halaman ini menganggap anda telah membaca Asas Komponen. Jika anda masih belum tahu banyak tentang komponen, saya syorkan anda membacanya terlebih dahulu.


Direktori

  • Nama komponen

    • nama komponen kes
  • Pendaftaran global
  • Pendaftaran separa
  • Sistem modul
    • Pendaftaran tempatan dalam sistem modul
    • Pendaftaran global automatik komponen asas


nama


Daftar satu apabila membuat komponen, kita sentiasa perlu memberikannya nama. Sebagai contoh, kami telah melihatnya semasa pendaftaran global: Vue.component 的第一个参数。

你给予组件的名字可能依赖于你打算拿它来做什么。当直接在 DOM 中使用一个组件 (而不是在字符串模板或单文件组件) 的时候,我们强烈推荐遵循 W3C 规范中的自定义组件名 (字母全小写且必须包含一个连字符)。这会帮助你避免和当前以及未来的 HTML 元素相冲突。

你可以在风格指南中查阅到关于组件名的其它建议。


组件名大小写

定义组件名的方式有两种:

使用 kebab-case

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

当使用 kebab-case (短横线分隔命名) 定义一个组件时,你也必须在引用这个自定义元素时使用 kebab-case,例如 <my-component-name>

使用 PascalCase

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

当使用 PascalCase (首字母大写命名) 定义一个组件时,你在引用这个自定义元素时两种命名法都可以使用。也就是说 <my-component-name><MyComponentName>

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

Nama komponen ialah parameter pertama Vue.component.


Nama yang anda berikan komponen anda mungkin bergantung pada tujuan anda menggunakannya. Apabila menggunakan komponen secara langsung dalam DOM (bukannya dalam templat rentetan atau komponen fail tunggal

), Kami amat mengesyorkan mengikuti penyesuaian dalam spesifikasi W3C 🎜 Nama komponen ( semua huruf kecil mesti mengandungi tanda sempang). Ini akan membantu anda mengelakkan konflik dengan elemen HTML semasa dan akan datang. 🎜🎜Anda boleh menemuinya di 🎜Sarung nama komponen 🎜🎜🎜🎜Terdapat dua cara untuk mentakrifkan nama komponen: 🎜🎜 kebab🎜 case🎜🎜
Vue.component('my-component-name', {
  // ... 选项 ...
})
🎜Apabila mentakrifkan komponen menggunakan kebab-case (nama dipisahkan sempang), anda juga mesti menggunakan kebab-case apabila merujuk elemen tersuai, seperti <my-component-name> 🎜🎜🎜Menggunakan PascalCase🎜🎜
Vue.component('component-a', { /* ... */ })
Vue.component('component-b', { /* ... */ })
Vue.component('component-c', { /* ... */ })

new Vue({ el: '#app' })
🎜Apabila mentakrifkan komponen menggunakan PascalCase (penamaan huruf besar), anda boleh menggunakan kedua-dua tatanama apabila merujuk elemen tersuai. Dalam erti kata lain, <my-component-name> dan <MyComponentName> kedua-duanya boleh diterima. Walau bagaimanapun, ambil perhatian bahawa hanya sarung kebab sahaja yang sah apabila digunakan secara langsung dalam DOM (iaitu templat bukan rentetan). 🎜🎜🎜🎜

Pendaftaran global


Setakat ini, kami hanya menggunakan Vue.component untuk mencipta komponen: Vue.component 来创建组件:

<div id="app">
  <component-a></component-a>
  <component-b></component-b>
  <component-c></component-c>
</div>

这些组件是全局注册的。也就是说它们在注册之后可以用在任何新创建的 Vue 根实例 (new Vue) 的模板中。比如:

var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
var ComponentC = { /* ... */ }
new Vue({
  el: '#app',
  components: {
    'component-a': ComponentA,
    'component-b': ComponentB
  }
})

在所有子组件中也是如此,也就是说这三个组件在各自内部也都可以相互使用。


局部注册


全局注册往往是不够理想的。比如,如果你使用一个像 webpack 这样的构建系统,全局注册所有的组件意味着即便你已经不再使用一个组件了,它仍然会被包含在你最终的构建结果中。这造成了用户下载的 JavaScript 的无谓的增加。

在这些情况下,你可以通过一个普通的 JavaScript 对象来定义组件:

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

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

然后在 components 选项中定义你想要使用的组件:

import ComponentA from './ComponentA.vue'

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

对于 components 对象中的每个属性来说,其属性名就是自定义元素的名字,其属性值就是这个组件的选项对象。

注意:局部注册的组件在其子组件中不可用。例如,如果你希望 ComponentAComponentB 中可用,则你需要这样写:

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

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

或者如果你通过 Babel 和 webpack 使用 ES2015 模块,那么代码看起来更像:

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

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

注意在 ES2015+ 中,在对象中放一个类似 ComponentA 的变量名其实是 ComponentA: ComponentA 的缩写,即这个变量名同时是:

  • 用在模板中的自定义元素的名称

  • 包含了这个组件选项的变量名


模块系统


如果你没有通过 import/require 使用一个模块系统,也许可以暂且跳过这个章节。如果你使用了,那么我们会为你提供一些特殊的使用说明和注意事项。


在模块系统中局部注册

如果你还在阅读,说明你使用了诸如 Babel 和 webpack 的模块系统。在这些情况下,我们推荐创建一个 components 目录,并将每个组件放置在其各自的文件中。

然后你需要在局部注册之前导入每个你想使用的组件。例如,在一个假设的 ComponentB.jsComponentB.vue 文件中:

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

现在 ComponentAComponentC 都可以在 ComponentB

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
  )
})

Komponen ini
didaftarkan secara global

. Maksudnya, ia boleh digunakan dalam templat mana-mana contoh akar Vue yang baru dibuat (Vue baharu
) selepas pendaftaran. Contohnya: 🎜rrreeerrreee🎜Begitu juga untuk semua sub-komponen, bermakna ketiga-tiga komponen ini juga boleh menggunakan satu sama lain secara dalaman. 🎜🎜🎜🎜

🎜🎜Pendaftaran separa🎜🎜🎜🎜🎜Pendaftaran global selalunya tidak sesuai. Sebagai contoh, jika anda menggunakan sistem binaan seperti webpack, mendaftarkan semua komponen secara global bermakna walaupun anda tidak lagi menggunakan komponen, ia akan tetap disertakan dalam hasil binaan akhir anda. Ini mengakibatkan peningkatan yang tidak perlu dalam jumlah JavaScript yang dimuat turun oleh pengguna. 🎜🎜Dalam kes ini, anda boleh mentakrifkan komponen melalui objek JavaScript biasa: 🎜rrreee🎜 Kemudian tentukan komponen yang anda mahu gunakan dalam pilihan komponen: 🎜rrreee🎜Untuk komponen Untuk setiap atribut dalam objek, nama atributnya ialah nama elemen tersuai, dan nilai atributnya ialah objek pilihan komponen ini. 🎜🎜Nota: 🎜Komponen yang didaftarkan separa tidak tersedia dalam komponen anak mereka🎜. Sebagai contoh, jika anda mahu ComponentA tersedia dalam ComponentB, anda akan menulis seperti ini: 🎜rrreee🎜 Atau jika anda menggunakan modul ES2015 melalui Babel dan webpack, maka kod akan kelihatan lebih baik Seperti: 🎜rrreee🎜 Ambil perhatian bahawa dalam ES2015+, meletakkan nama pembolehubah seperti ComponentA dalam objek sebenarnya adalah singkatan daripada ComponentA: ComponentA, iaitu pembolehubah ini nama juga ialah: 🎜
  • 🎜Nama elemen tersuai yang digunakan dalam templat🎜
  • 🎜Mengandungi nama pembolehubah komponen ini pilihan🎜
🎜🎜🎜

🎜🎜Sistem Modul🎜🎜🎜🎜🎜Jika anda tidak menggunakannya melalui import/< kod>memerlukan Sistem modul, mungkin anda boleh melangkau bab ini buat masa ini. Jika anda menggunakannya, maka kami akan memberikan anda beberapa arahan dan langkah berjaga-jaga khas. 🎜🎜🎜🎜🎜

🎜Sebahagiannya didaftarkan dalam sistem modul🎜🎜🎜🎜Jika anda masih membaca, anda menggunakan sesuatu seperti Babel dan sistem modul webpack. Dalam kes ini, kami mengesyorkan membuat direktori komponen dan meletakkan setiap komponen dalam failnya sendiri. 🎜🎜Maka anda perlu mengimport setiap komponen yang anda ingin gunakan sebelum mendaftarkannya secara tempatan. Contohnya, dalam fail ComponentB.js atau ComponentB.vue hipotesis: 🎜rrreee🎜Now ComponentA dan ComponentC > boleh digunakan dalam templat ComponentB. 🎜🎜🎜🎜

Pendaftaran global automatik bagi komponen asas

Mungkin kebanyakan komponen anda hanya membungkus elemen seperti kotak input atau butang, yang agak generik. Kami kadangkala memanggilnya komponen asas, dan ia kerap digunakan dalam pelbagai komponen.

Banyak komponen akan mempunyai senarai panjang komponen asas:

rrreee

Dan hanya untuk sebahagian kecil templat:

rrreee

Nasib baik jika anda menggunakan webpack (atau menggunakan webpack secara dalaman Vue CLI 3+), maka anda boleh menggunakan kod sampel untuk mengimport komponen asas secara global dalam require.context 只全局注册这些非常通用的基础组件。这里有一份可以让你在应用入口文件 (比如 src/main.js):

rrreee

Ingatbahawa gelagat pendaftaran global mesti berlaku sebelum instance root Vue (melalui Vue baharu) dicipta. Di sini terdapat contoh dalam senario projek sebenar.