vue组件的实现
Vue 组件的实现方式
Vue 组件可以通过多种方式实现,包括单文件组件(SFC)、全局注册和局部注册。以下是常见的实现方法。
单文件组件(SFC)
单文件组件是 Vue 推荐的方式,将模板、逻辑和样式封装在一个 .vue 文件中。
示例代码:
<template>
<div class="example">
{{ message }}
</div>
</template>
<script>
export default {
data() {
return {
message: 'Hello Vue!'
}
}
}
</script>
<style scoped>
.example {
color: red;
}
</style>
全局注册组件
通过 Vue.component 全局注册组件,可以在任何地方使用。
示例代码:
Vue.component('my-component', {
template: '<div>A custom component!</div>'
});
new Vue({
el: '#app'
});
局部注册组件
在父组件中通过 components 选项局部注册组件,仅在该父组件作用域内可用。
示例代码:
const ChildComponent = {
template: '<div>Child Component</div>'
};
new Vue({
el: '#app',
components: {
'child-component': ChildComponent
}
});
使用 defineComponent(Vue 3)
在 Vue 3 中,推荐使用 defineComponent 定义组件,提供更好的 TypeScript 支持。
示例代码:
import { defineComponent } from 'vue';
export default defineComponent({
name: 'MyComponent',
data() {
return {
count: 0
};
},
methods: {
increment() {
this.count++;
}
}
});
动态组件
通过 <component :is="currentComponent"> 动态切换组件。
示例代码:

<template>
<component :is="currentComponent"></component>
</template>
<script>
import ComponentA from './ComponentA.vue';
import ComponentB from './ComponentB.vue';
export default {
data() {
return {
currentComponent: 'ComponentA'
};
},
components: {
ComponentA,
ComponentB
}
};
</script>
组件通信方式
Props 传递数据
父组件通过 props 向子组件传递数据。
示例代码:
<!-- 父组件 -->
<template>
<child-component :message="parentMessage"></child-component>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: { ChildComponent },
data() {
return {
parentMessage: 'Hello from parent'
};
}
};
</script>
<!-- 子组件 -->
<template>
<div>{{ message }}</div>
</template>
<script>
export default {
props: ['message']
};
</script>
自定义事件($emit)
子组件通过 $emit 触发事件,父组件通过 v-on 监听。
示例代码:
<!-- 子组件 -->
<template>
<button @click="notifyParent">Click Me</button>
</template>
<script>
export default {
methods: {
notifyParent() {
this.$emit('child-event', 'Data from child');
}
}
};
</script>
<!-- 父组件 -->
<template>
<child-component @child-event="handleEvent"></child-component>
</template>
<script>
import ChildComponent from './ChildComponent.vue';
export default {
components: { ChildComponent },
methods: {
handleEvent(data) {
console.log(data); // 'Data from child'
}
}
};
</script>
使用 provide 和 inject
跨层级组件通信,父组件通过 provide 提供数据,子组件通过 inject 注入。
示例代码:

// 父组件
export default {
provide() {
return {
sharedData: 'Shared value'
};
}
};
// 子组件
export default {
inject: ['sharedData'],
mounted() {
console.log(this.sharedData); // 'Shared value'
}
};
Vuex/Pinia 状态管理
对于复杂应用,可以使用 Vuex(Vue 2)或 Pinia(Vue 3)集中管理状态。
示例代码(Pinia):
// store.js
import { defineStore } from 'pinia';
export const useCounterStore = defineStore('counter', {
state: () => ({
count: 0
}),
actions: {
increment() {
this.count++;
}
}
});
// 组件中使用
import { useCounterStore } from './store';
export default {
setup() {
const store = useCounterStore();
return { store };
}
};
生命周期钩子
Vue 组件提供生命周期钩子,用于在特定阶段执行逻辑。
常用钩子:
created:组件实例创建后调用。mounted:DOM 挂载后调用。updated:数据更新导致 DOM 重新渲染后调用。destroyed:组件销毁后调用。
示例代码:
export default {
created() {
console.log('Component created');
},
mounted() {
console.log('DOM mounted');
}
};
插槽(Slots)
通过插槽实现内容分发,增强组件灵活性。
示例代码:
<!-- 父组件 -->
<template>
<child-component>
<template v-slot:default>
Default slot content
</template>
<template v-slot:footer>
Footer content
</template>
</child-component>
</template>
<!-- 子组件 -->
<template>
<div>
<slot></slot>
<footer>
<slot name="footer"></slot>
</footer>
</div>
</template>






