- Pelajari
-
Ekosistem
Pertolongan
Alat
Pustaka Inti
Berita
Daftar Sumber Daya
- Tim
- Dukung Vue
- Terjemahan
Petunjuk
Esensial
- Instalasi
- Perkenalan
- Vue Instance
- Sintaks Templat
- Properti Penghitung (Computed) dan Pengamat (Watchers)
- Kelas and Binding Gaya
- Rendering Bersyarat
- Me-render Daftar
- Penanganan Event
- Form Input Bindings
- Komponen Dasar
Komponen secara mendalam
- Registrasi Komponen
- Props
- Custom Events
- Slot
- Komponen yang Dinamis & Async
- Menangani Kasus Langka
Transisi & Animasi
- Transisi Masuk/Keluar & Daftar Transisi
- Transisi State
Kebergunaan & Komposisi
- Mixins
- Direktif Kustom
- Fungsi Render & JSX
- Plugin
- Filter
Peralatan
- Komponen Berkas Tunggal
- Unit Testing
- Dukungan TypeScript
- Penempatan Produksi
Peningkatan
- Routing
- Pengelolaan State
- Rendering di Sisi Server (SSR)
Internal
- Reaktivitas Secara Mendalam
Migrasi
- Migrasi dari Vue 1.x
- Migrasi dari Vuex 0.6.x ke 1.0
Meta
- Perbandingan dengan Kerangka Kerja yang Lain
- Gabung Komunitas Vue.js!
- Tim Inti Vuejs
Registrasi Komponen
Halaman ini berasumsi Anda telah membaca dasar-dasar komponen. Baca halaman itu terlebih dahulu bila Anda belum mengerti komponen.
Nama Komponen
Ketika mendaftarkan sebuah komponen, selalu berikan nama. Misalnya, untuk sebuah registrasi global kita akan melihat seperti berikut:
Vue.component('my-component-name', { /* ... */ })
Nama komponen adalah argumen pertama dari Vue.component
.
Nama yang Anda berikan ke komponen mungkin tergantung pada dimana Anda akan menggunakannya. Ketika menggunakan komponen secara langsung di dalam DOM ( sebagai lawan di dalam template string atau berkas komponen tunggal (single-file component)), kita sangat merekomendasikan untuk mengikuti Panduan W3C untuk membuat nama tag custom (semuanya huruf kecil, harus berisi tAnda penghubung). Ini membantu Anda untuk menghindari konflik dengan elemen HTML sekarang dan kedepanya.
Anda bisa melihat rekomendasi lainya untuk nama nama komponen di Panduan Gaya.
Aturan Huruf Nama (Name Casing)
Anda mempunyai dua pilihan ketika mendefinisikan nama komponen:
Dengan kebab-case
Vue.component('nama-komponen-saya', { /* ... */ })
Ketika mendefinisikan komponen dengan kebab-case, Anda juga harus menggunakan kebab-case ketika memberi referensi ke elemen custom, seperti di <nama-komponen-saya>
.
Dengan PascalCase
Vue.component('NamaKomponenSaya', { /* ... */ })
Ketika mendefinisikan komponen dengan PascalCase, Anda dapat menggunakan kedua hal ketika memberi referensi ke custom elemenya. Itu berarti, kedua <nama-komponen-saya>
dan <NamaKomponenSaya>
dapat diterima. Catatan, meskipun hanya nama kebab-case yang valid secara langsung di DOM (contoh : templates non-string).
Registrasi Global
Sejauh ini, kita hanya membuat komponen menggunakan Vue.component
:
Vue.component('nama-komponen-saya', {
// ... pilihan ...
})
Komponen ini teregistrasi secara global. Itu berarti mereka dapat digunakan di dalam template dari semua root Vue Instance (new Vue
) dibuat setelah diregistrasi. Sebagai contoh:
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>
Ini bahkan berlaku kepada semua sub komponen, berarti tiga komponen tersebut juga tersedia di dalam satu sama lain.
Registrasi Lokal
Registrasi global jarang menjadi ideal. Sebagai contoh, ketika Anda menggunakan build system seperti Webpack, meregistrasi global semua komponen berarti ketika Anda berhenti menggunakan sebuah komponen, itu juga masih termasuk di final build Anda. Ketidakperluan ini menambah banyak Javascript yang harus di unduh oleh pengguna Anda.
Pada kasus ini, Anda bisa menetapkan komponen Anda sebagai objek Javascript sederhana:
var ComponentA = { /* ... */ }
var ComponentB = { /* ... */ }
var ComponentC = { /* ... */ }
Lalu tetapkan komponen komponen yang akan Anda gunakan di opsi komponen
new Vue({
el: '#app',
components: {
'component-a': ComponentA,
'component-b': ComponentB
}
})
Untuk setiap properti di dalam objek components
, kuncinya akan menjadi nama dari elemen custom, ketika nilai akan berisi pilihan objek dari komponen tersebut.
Catat bahwa komponen yang terdaftar secara lokal juga tidak terdapat di dalam sub komponen. Sebagai contoh, jika Anda ingin Component A
terdapat di dalam Component B
, Anda harus menggunakan:
var ComponentA = { /* ... */ }
var ComponentB = {
components: {
'component-a': ComponentA
},
// ...
}
Atau jika Anda menggunakan modul ES2015, seperti menggunakan Babel dan Webpack, itu akan lebih terlihat seperti:
import ComponentA from './ComponentA.vue'
export default {
components: {
ComponentA
},
// ...
}
Catat bahwa di ES2015+, menempatkan nama variabel seperti ComponentA
di dalam shorthand objek untukComponentA: ComponentA
, berarti nama dari kedua variabel adalah:
- nama elemen custom yang digunakan di template, dan
- nama dari variabel berisi pilihan komponen
Sistem Modul
Ketika Anda tidak menggunakan sistem modul dengan import
/require
, Anda mungkin bisa melewati bagian ini untuk sekarang. Jika Anda menggunakanya, kita punya beberapa arahan spesial dan tips khusus untukmu.
Registrasi Lokal di dalam Sistem Modul
Jika Anda masih disini, berarti sepertinya Anda menggunakan sistem modul, seperti Babel dan Webpack. Pada kasus ini, kita merekomendasi membuat sebuah direktori komponen
, dengan setiap komponen memiliki filenya sendiri.
Lalu Anda harus memasukan setiap komponen yang akan Anda gunakan, sebelum Anda mendaftarkanya secara lokal. Sebagai contoh, di sebuah hypothetical ComponentB.js
atau ComponentB.vue
file:
import ComponentA from './ComponentA'
import ComponentC from './ComponentC'
export default {
components: {
ComponentA,
ComponentC
},
// ...
}
Sekarang kedua ComponentA
Dan ComponentC
dapat digunakan di dalam template ComponentB
.
Registrasi Otomatis Global dari Komponen Dasar
Banyak dari komponen Anda akan generik secara relatif, mungkin hanya membungkus elemen seperti sebuah tombol atau input. Kita terkadang mengacu pada ini sebagai komponen dasar dan mereka cenderung sering digunakan di beberapa komponen Anda.
Hasilnya adalah banyak komponen mungkin memasukan daftar panjang dari komponen dasar:
import BaseButton from './BaseButton.vue'
import BaseIcon from './BaseIcon.vue'
import BaseInput from './BaseInput.vue'
export default {
components: {
BaseButton,
BaseIcon,
BaseInput
}
}
Hanya untuk membantu sedikit markup yang sama di sebuah template:
<BaseInput
v-model="searchText"
@keydown.enter="search"
/>
<BaseButton @click="search">
<BaseIcon name="search"/>
</BaseButton>
Untungnya, jika Anda menggunakan Webpack (atau Vue CLI 3+, yang menggunakan Webpack di dalamnya), Anda bisa menggunakan require.context
untuk mendaftarkan secara global komponen dasar yang paling umum. Berikut ini adalah contoh dari kode yang mungkin Anda gunakan secara global untuk memasukan komponen dasar di awalan file aplikasi milik Anda (contohnya src/main.js
):
import Vue from 'vue'
import upperFirst from 'lodash/upperFirst'
import camelCase from 'lodash/camelCase'
const requireComponent = require.context(
// The relative path of the components folder
'./components',
// Whether or not to look in subfolders
false,
// The regular expression used to match base component filenames
/Base[A-Z]\w+\.(vue|js)$/
)
requireComponent.keys().forEach(fileName => {
// Get component config
const componentConfig = requireComponent(fileName)
// Get PascalCase name of component
const componentName = upperFirst(
camelCase(
// Gets the file name regardless of folder depth
fileName
.split('/')
.pop()
.replace(/\.\w+$/, '')
)
)
// Register component globally
Vue.component(
componentName,
// Look for the component options on `.default`, which will
// exist if the component was exported with `export default`,
// otherwise fall back to module's root.
componentConfig.default || componentConfig
)
})
Harap diingat bahsaw pendaftaran global harus terjadi sebelum root instance Vue dibuat (dengan new Vue
). Berikut contohnya dari pola ini di dalam konteks proyek sungguhan.