IT评测·应用市场-qidao123.com技术社区

标题: Vue入门级教程六:组件间通信与插槽 [打印本页]

作者: 张国伟    时间: 2024-12-6 23:10
标题: Vue入门级教程六:组件间通信与插槽
在前面的Vue入门级教程中,我们已经学习了Vue的基础知识,包罗模板语法、指令、计算属性、侦听器以及组件的创建和使用。本日,我们将深入探究Vue组件间通信的方法以及插槽(slot)的使用,这两个主题对于构建复杂的Vue应用程序至关紧张。
一、组件间通信

(一)父组件向子组件传递数据(Props)

  1. <template>
  2.   <div>
  3.     <ChildComponent :message="parentMessage" />
  4.   </div>
  5. </template>
  6. <script>
  7. import ChildComponent from './ChildComponent.vue';
  8. export default {
  9.   components: {
  10.     ChildComponent
  11.   },
  12.   data() {
  13.     return {
  14.       parentMessage: '这是父组件传递给子组件的消息'
  15.     };
  16.   }
  17. };
  18. </script>
复制代码
在子组件中:
  1. <template>
  2.   <div>
  3.     <p>{{ message }}</p>
  4.   </div>
  5. </template>
  6. <script>
  7. export default {
  8.   props: {
  9.     message: String
  10.   }
  11. };
  12. </script>
复制代码
这样,父组件中的parentMessage数据就传递到了子组件中,并可以在子组件的模板中使用。
  1. <template>
  2.   <div>
  3.     <input v-model="parentMessage" />
  4.     <ChildComponent :message="parentMessage" />
  5.   </div>
  6. </template>
复制代码
当用户在输入框中输入内容时,子组件会立刻更新显示的消息。
(二)子组件向父组件传递数据(自界说变乱)

  1. <template>
  2.   <div>
  3.     <button @click="sendDataToParent">向父组件传递数据</button>
  4.   </div>
  5. </template>
  6. <script>
  7. export default {
  8.   methods: {
  9.     sendDataToParent() {
  10.       const data = '这是子组件传递给父组件的数据';
  11.       this.$emit('childData', data);
  12.     }
  13.   }
  14. };
  15. </script>
复制代码
在父组件中,通过v-on指令监听子组件触发的变乱,并在变乱处理函数中接收数据。
在父组件的模板中:
  1. <template>
  2.   <div>
  3.     <ChildComponent @childData="handleChildData" />
  4.     <p>{{ receivedData }}</p>
  5.   </div>
  6. </template>
  7. <script>
  8. import ChildComponent from './ChildComponent.vue';
  9. export default {
  10.   components: {
  11.     ChildComponent
  12.   },
  13.   data() {
  14.     return {
  15.       receivedData: ''
  16.     };
  17.   },
  18.   methods: {
  19.     handleChildData(data) {
  20.       this.receivedData = data;
  21.     }
  22.   }
  23. };
  24. </script>
复制代码
当子组件中的按钮被点击时,父组件会接收到子组件传递的数据,并更新receivedData的值,从而在页面上显示出来。
(三)兄弟组件通信(通过共同的父组件)

  1. <template>
  2.   <div>
  3.     <button @click="sendDataToParent">向兄弟组件传递数据</button>
  4.   </div>
  5. </template>
  6. <script>
  7. export default {
  8.   methods: {
  9.     sendDataToParent() {
  10.       const data = '这是兄弟组件A传递的数据';
  11.       this.$emit('sendData', data);
  12.     }
  13.   }
  14. };
  15. </script>
复制代码
在ParentComponent中:
  1. <template>
  2.   <div>
  3.     <BrotherComponentA @sendData="handleDataFromA" />
  4.     <BrotherComponentB :dataFromA="dataForB" />
  5.   </div>
  6. </template>
  7. <script>
  8. import BrotherComponentA from './BrotherComponentA.vue';
  9. import BrotherComponentB from './BrotherComponentB.vue';
  10. export default {
  11.   components: {
  12.     BrotherComponentA,
  13.     BrotherComponentB
  14.   },
  15.   data() {
  16.     return {
  17.       dataForB: ''
  18.     };
  19.   },
  20.   methods: {
  21.     handleDataFromA(data) {
  22.       this.dataForB = data;
  23.     }
  24.   }
  25. };
  26. </script>
复制代码
在BrotherComponentB中:
  1. <template>
  2.   <div>
  3.     <p>{{ dataFromA }}</p>
  4.   </div>
  5. </template>
  6. <script>
  7. export default {
  8.   props: {
  9.     dataFromA: String
  10.   }
  11. };
  12. </script>
复制代码
这样,兄弟组件A的数据就可以通过父组件传递给兄弟组件B。
(四)非父子、非兄弟组件通信(使用变乱总线或Vuex)

  1. import Vue from 'vue';
  2. export const eventBus = new Vue();
复制代码
在组件A中,触发变乱:
  1. <template>
  2.   <div>
  3.     <button @click="sendDataToOtherComponent">向其他组件传递数据</button>
  4.   </div>
  5. </template>
  6. <script>
  7. import { eventBus } from '../event-bus.js';
  8. export default {
  9.   methods: {
  10.     sendDataToOtherComponent() {
  11.       const data = '这是组件A传递的数据';
  12.       eventBus.$emit('dataFromA', data);
  13.     }
  14.   }
  15. };
  16. </script>
复制代码
在组件B中,监听变乱:
  1. <template>
  2.   <div>
  3.     <p>{{ receivedData }}</p>
  4.   </div>
  5. </template>
  6. <script>
  7. import { eventBus } from '../event-bus.js';
  8. export default {
  9.   data() {
  10.     return {
  11.       receivedData: ''
  12.     };
  13.   },
  14.   mounted() {
  15.     eventBus.$on('dataFromA', (data) => {
  16.       this.receivedData = data;
  17.     });
  18.   }
  19. };
  20. </script>
复制代码
使用变乱总线可以方便地实现非父子、非兄弟组件之间的通信,但在大型项目中,假如使用不妥,可能会导致变乱管理混乱,因此必要谨慎使用。
二、插槽(slot)

  1. <template>
  2.   <div class="alert">
  3.     <slot></slot>
  4.   </div>
  5. </template>
  6. <style scoped>
  7. .alert {
  8.   border: 1px solid #ccc;
  9.   padding: 10px;
  10.   background-color: #f9f9f9;
  11. }
  12. </style>
复制代码
在父组件中:
  1. <template>
  2.   <div>
  3.     <AlertComponent>这是提示框的内容</AlertComponent>
  4.   </div>
  5. </template>
复制代码
这样,父组件中的“这是提示框的内容”就会显示在子组件的提示框内。
  1. <template>
  2.   <div class="card">
  3.     <header><slot name="header"></slot></header>
  4.     <main><slot name="main"></slot></main>
  5.     <footer><slot name="footer"></slot></footer>
  6.   </div>
  7. </template>
复制代码
在父组件中,使用v-slot指令(缩写为#)来指定内容插入到哪个具名插槽中:
  1. <template>
  2.   <div>
  3.     <CardComponent>
  4.       <template v-slot:header>
  5.         <h2>卡片标题</h2>
  6.       </template>
  7.       <template #main>
  8.         <p>卡片正文内容</p>
  9.       </template>
  10.       <template v-slot:footer>
  11.         <p>卡片底部信息</p>
  12.       </template>
  13.     </CardComponent>
  14.   </div>
  15. </template>
复制代码
这样,父组件中的内容就会分别插入到子组件对应的具名插槽中。
  1. <template>
  2.   <div class="list">
  3.     <ul>
  4.       <li v-for="item in items" :key="item.id">
  5.         <slot :item="item"></slot>
  6.       </li>
  7.     </ul>
  8.   </div>
  9. </template>
  10. <script>
  11. export default {
  12.   data() {
  13.     return {
  14.       items: [
  15.         { id: 1, name: '苹果', price: 5 },
  16.         { id: 2, name: '香蕉', price: 3 },
  17.         { id: 3, name: '橙子', price: 4 }
  18.       ]
  19.     };
  20.   }
  21. };
  22. </script>
复制代码
在父组件中:
  1. <template>
  2.   <div>
  3.     <ItemListComponent>
  4.       <template v-slot="{ item }">
  5.         <p>{{ item.name }} - 价格: {{ item.price }}</p>
  6.       </template>
  7.     </ItemListComponent>
  8.   </div>
  9. </template>
复制代码
父组件可以根据子组件传递过来的item数据来渲染每个列表项的内容。
通过学习组件间通信和插槽的使用,我们可以构建更加灵活和复杂的Vue应用程序。在现实开发中,根据不同的场景选择合适的通信方式和插槽用法,能够进步代码的可读性、可维护性和复用性。希望本教程对你在Vue的学习过程中有所帮助,后续我们将继续深入学习Vue的其他高级特性。假如你有任何问题或发起,接待在批评区留言。

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 IT评测·应用市场-qidao123.com技术社区 (https://dis.qidao123.com/) Powered by Discuz! X3.4