1、创建组件
单文件组件是 Vue 组件的推荐方式,使用 .vue
文件格式来定义组件的模板、脚本和样式。
<!-- HelloWorld.vue -->
<template>
<div class="hello">
<h1>{{ message }}</h1>
</div>
</template>
<script>
export default {
name: 'HelloWorld',
props: {
message: String
}
}
</script>
<style scoped>
.hello {
color: blue;
}
</style>
1)全局注册组件
在 main.js
文件中,可以全局注册组件:
import Vue from 'vue';
import App from './App.vue';
import HelloWorld from './components/HelloWorld.vue';
Vue.component('HelloWorld', HelloWorld);
new Vue({
render: h => h(App),
}).$mount('#app');
2)局部注册组件
<template>
<div id="app">
<HelloWorld message="Hello Vue!"/>
</div>
</template>
<script>
import HelloWorld from './components/HelloWorld.vue';
export default {
name: 'App',
components: {
HelloWorld
}
}
</script>
2、组件的属性(Props)
Props
是父组件传递给子组件的数据。子组件通过 props
选项声明它们期望接收的 prop
。
<template>
<div>
<p>{{ message }}</p>
</div>
</template>
<script>
export default {
name: 'ChildComponent',
props: {
message: {
type: String,
required: true
}
}
}
</script>
父组件使用该子组件时传递 message prop:
<template>
<div>
<ChildComponent message="Hello from parent"/>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
name: 'ParentComponent',
components: {
ChildComponent
}
}
</script>
3、组件的事件(Events)
子组件可以通过 $emit
方法向父组件发送事件,父组件可以监听这些事件。
1)子组件
<template>
<button @click="sendMessage">Click me</button>
</template>
<script>
export default {
name: 'ChildComponent',
methods: {
sendMessage() {
this.$emit('message-sent', 'Hello from child');
}
}
}
</script>
2)父组件
<template>
<div>
<ChildComponent @message-sent="handleMessage"/>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
name: 'ParentComponent',
components: {
ChildComponent
},
methods: {
handleMessage(message) {
console.log(message);
}
}
}
</script>
4、插槽(Slots)
插槽可以在子组件模板中插入内容。
1)默认插槽
<template>
<div>
<slot></slot>
</div>
</template>
使用子组件时,可以在组件标签中嵌入内容:
<template>
<div>
<ChildComponent>
<p>This is some slot content</p>
</ChildComponent>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
name: 'ParentComponent',
components: {
ChildComponent
}
}
</script>
2)具名插槽
<template>
<div>
<slot name="header"></slot>
<slot></slot>
<slot name="footer"></slot>
</div>
</template>
使用具名插槽:
<template>
<div>
<ChildComponent>
<template v-slot:header>
<h1>This is the header</h1>
</template>
<p>This is some default slot content</p>
<template v-slot:footer>
<p>This is the footer</p>
</template>
</ChildComponent>
</div>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
name: 'ParentComponent',
components: {
ChildComponent
}
}
</script>
5、动态组件
Vue 提供了 component
组件,可以动态地在多个组件之间进行切换:
<template>
<div>
<component :is="currentComponent"></component>
<button @click="toggleComponent">Toggle Component</button>
</div>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
name: 'DynamicComponent',
data() {
return {
currentComponent: 'ComponentA'
}
},
components: {
ComponentA,
ComponentB
},
methods: {
toggleComponent() {
this.currentComponent = this.currentComponent === 'ComponentA' ? 'ComponentB' : 'ComponentA';
}
}
}
</script>
6、异步组件
Vue 可以定义返回一个 Promise
的工厂函数,来按需加载组件:
const AsyncComponent = () => ({
component: import('./AsyncComponent.vue'),
loading: LoadingComponent,
error: ErrorComponent,
delay: 200,
timeout: 3000
});
export default {
components: {
AsyncComponent
}
}