1. 前言
具体细节参考 Vue 官方文档 ,本章节会详细讲解到 Vue 组件开发。
本章节的案例会涉及到前两章的内容 
具体内容如下
2. 什么是组件❔
组件:在程序中组件就是对数据和方法的简单封装。
Vue 组件:这是 Vue 的亮点之一,组件 允许我们将 UI 划分为独立的、可重用的部分,并且可以对每个部分进行单独的思考。
例子:例如一个表单包含如下内容(搜索栏、列表页、分页条、新增|编辑页、详情页),那我们就可以通过组件化的思想将这些模块封装成一个个组件。

3. 组件注册
在 Vue 中,如果我们需要某些地方使用到组件,那么就必须要进行注释。
我将会通过两种方式进行组件注册:
3.1. 全局注册
全局注册:在应用的任何地方都可以使用的组件称为全局组件。
1 2
   | # tagName 为组件名,options 为配置选项 Vue.component(tagName, options)
   | 
 
假设,我们需要在全局注册。那我们我们在 main.js 进行注册组件即可
1 2 3 4 5 6 7 8 9 10
   | import Vue from 'vue'; import App from './App.vue'; # MyComponent被全局注册为my-component,这意味着你可以在应用中的任何地方使用<my-component></my-component>标签。 import MyComponent from './components/MyComponent.vue';
  Vue.component('my-component', MyComponent);
  new Vue({   render: h => h(App)  }).$mount('#app'); 
   | 
 
3.2. 局部注册
局部注册:将组件限制在一个特定的 Vue 实例或另一个组件的作用域内。
假设,我们需要在局部注册。那我们我们在 局部组件 引入组件即可。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   |  <template>   <div>     <my-component></my-component>   </div> </template>
  <script> import MyComponent from './MyComponent.vue';
  export default {   components: {     'my-component': MyComponent   }, }; </script>
 
  | 
 
4. 组件通信
组件通信:这个模块是非常非常重要的,Vue 的特色组件化。既然涉及到组件化了,那么就一定会涉及到组件之间的通信。
我们会通过如下内容来讲解组件通信
- 父子组件通信(props、$emit)
 
- 父组件访问子组件($refs)
 
4.1. 父子组件通信
父子组件:通过官网的组件图可以看到,组件和组件之间是存在层级关系的,我们这里主要讨论父子组件。
4.1.1. props
props:是用于将数据从父组件传递到子组件的机制。父组件通过将数据绑定到子组件的属性上,使子组件可以接受并使用这些数据。
props 可以是任何类型的数据,包括字符串、数字、对象、数组等。
1 2 3 4 5 6 7 8
   | export default {   props: {     filed: {       type: Boolean,       default: true     }   }, }
  | 
 
假设我们需要通过父组件向子组件进行传值
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | <template>   <div>     <h3> 我是父组件 </h3>     <child-view :message="parentMessage" />   </div> </template>
  <script> import ChildView from './ChildView.vue';
  export default {   components: {       ChildView,   },   data() {     return {       parentMessage: 'Hello from parent!',     };   }, }; </script>
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | <template>   <div>     <h3>我是子组件</h3>     <p>{{ message }}</p>   </div> </template>
  <script> export default {   props: {      message:{       type: String     }   }, }; </script>
   | 
 

4.1.2. $emit
$emit :是用于在子组件中触发自定义事件,并向父组件发送消息的方法。
子组件可以使用 $emit 来通知父组件发生了某些事件或状态的变化,从而实现子组件向父组件传递数据。
假设我们在子组件中与父组件通信。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
   | <template>   <div>     <h3>我是子组件</h3>     <button @click="sendEventToParent">向父组件发送消息</button>   </div> </template>
  <script> export default {   methods: {     sendEventToParent() {       this.$emit('child-event', 'Hello from child!');     },   }, }; </script>
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
   | <template>   <div>     <h3>我是父组件</h3>     <p>{{ message }}</p>     <child-view @child-event="handleChildEvent" />   </div> </template>
  <script> import ChildView from './ChildView.vue';
  export default {   components: {     ChildView   },   data() {     return {       message : ''     }   },   methods: {     handleChildEvent(messageFromChild) {       this.message = messageFromChild       console.log('Message from child:', messageFromChild);     },   }, }; </script>
   | 
 

4.2. 父组件访问子组件
4.2.1. $refs
$refs 是 Vue.js 提供的一个特殊属性,用于在组件中访问被标记为 ref 的子组件或 DOM 元素。通过 $refs,你可以在父组件中直接引用子组件的实例或操作 DOM 元素,而不需要通过事件或 props 进行数据传递。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27
   | <template>   <div>     <h3>我是父组件</h3>     <button @click="callChildMethod"> 调用子组件方法 </button>     <child-view ref="childRef" />   </div> </template>
  <script> import ChildView from './ChildView.vue';
  export default {   components: {     ChildView   },   data() {     return {       message : ''     }   },   methods: {     callChildMethod() {       this.$refs.childRef.childMethod();     },   }, }; </script>
   | 
 
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
   | <template>   <div>     <h3>我是子组件</h3>     <p>{{ message }}</p>   </div> </template>
  <script> export default {   data() {     return {       message : ''     }   },   methods: {     childMethod() {      this.message = '父子调用子组件成功'     },   } }; </script>
   | 
 
