Vue.component('my-component', {
template: '<div>A custom component!</div>'
})
const ComponentA = {
template: '<div>Component A</div>'
}
new Vue({
el: '#app',
components: {
'component-a': ComponentA
}
})
Vue.component('blog-post', {
props: ['title'],
template: '<h3>{{ title }}</h3>'
})
<blog-post title="My journey with Vue"></blog-post>
props: {
title: String,
likes: Number,
isPublished: Boolean,
commentIds: Array,
author: Object,
callback: Function,
contactsPromise: Promise
}
props: {
propA: Number,
propB: [String, Number],
propC: {
type: String,
required: true
},
propD: {
type: Number,
default: 100
},
propE: {
type: Object,
default: function () {
return { message: 'hello' }
}
},
propF: {
validator: function (value) {
return ['success', 'warning', 'danger'].indexOf(value) !== -1
}
}
}
<blog-post @enlarge-text="postFontSize += 0.1"></blog-post>
methods: {
enlargeText() {
this.$emit('enlarge-text')
}
}
this.$emit('enlarge-text', 0.1)
<blog-post @enlarge-text="postFontSize += $event"></blog-post>
<div class="container">
<slot></slot>
</div>
<navigation-link>
Your Profile
</navigation-link>
<div class="container">
<header>
<slot name="header"></slot>
</header>
<main>
<slot></slot>
</main>
<footer>
<slot name="footer"></slot>
</footer>
</div>
<base-layout>
<template v-slot:header>
<h1>Here might be a page title</h1>
</template>
<p>A paragraph for the main content.</p>
<template v-slot:footer>
<p>Here's some contact info</p>
</template>
</base-layout>
<ul>
<li v-for="todo in todos" :key="todo.id">
<slot :todo="todo"></slot>
</li>
</ul>
<todo-list>
<template v-slot:default="slotProps">
<span>{{ slotProps.todo.text }}</span>
</template>
</todo-list>
<component :is="currentTabComponent"></component>
<keep-alive>
<component :is="currentTabComponent"></component>
</keep-alive>
Vue.component('async-example', function (resolve, reject) {
setTimeout(function () {
resolve({
template: '<div>I am async!</div>'
})
}, 1000)
})
Vue.component('async-webpack-example', () => import('./my-async-component'))