• vue3 组件通讯


    目录

     

    为什么进行组件通讯 

    1 父传子

    2 子传父

    3 兄弟传参

    为什么进行组件通讯 

          vue组件之间遵循  封闭且开放 的原则 这里的 封闭是指组件之间有各自的逻辑

           开放是指组件之间可以通过各种方式进行通讯 以下是一些常用的组件通讯方式

    1 父传子

      解释 顾名思义,是父组件向子组件进行通讯,是在父元素中去定义自定义属性 在导入的子组件的标签   中

     步骤

    1 导入子组件

    import Son from './Son.vue'

    2传入父组件自定义属性

    <Son name="张三"/>

    这个name就是父组件的自定义属性,张三就是这个属性的值 也可以传入变量当然要都是非函数

    1. <template>
    2. <div class="father">
    3. <h1>Emit</h1>
    4. <h2>父组件</h2>
    5. <Son :name="name"/>
    6. </div>
    7. </template>
    8. <script lang="ts" setup name="father">
    9. import { ref } from 'vue';
    10. import Son from './Son.vue'
    11. let name=ref('张三')
    12. </script>

      3 子组件接受父组件

    1. <template>
    2. <div class="son">
    3. <h3>子组件</h3>
    4. {{ name }}
    5. </div>
    6. </template>
    7. <script lang="ts" setup name="son">
    8. import { defineProps } from 'vue';
    9. defineProps(['name'])
    10. </script>

    利用 defineProps 进行父组件数据的接受 注意这个数据是只读的 

    2 子传父

    子传父有两种方式 

      1 利用 父组件的自定义属性传一个函数 给子组件

    1. <template>
    2. <div class="father">
    3. <h1>Emit</h1>
    4. <h2>父组件</h2>
    5. <Son :gettop="gettop"/>
    6. {{ toy }}
    7. </div>
    8. </template>
    9. <script lang="ts" setup name="father">
    10. import { ref } from 'vue';
    11. import Son from './Son.vue'
    12. let toy=ref('')
    13. let gettop=(value:string)=>{
    14. console.log(1);
    15. toy.value=value
    16. }
    17. </script>

    子组件接受这个函数 并传递一个值 从而实现子组件向父组件的传值

    1. <template>
    2. <div class="son">
    3. <h3>子组件</h3>
    4. <button @click="gettop('奥特曼')">send</button>
    5. </div>
    6. </template>
    7. <script lang="ts" setup name="son">
    8. import { defineProps } from 'vue';
    9. defineProps(['gettop'])
    10. </script>

      另一种方式就是子组件通过自定义事件 将函数传递给父组件

    在vue2 里我们是通过 this.$emit进行自定义事件的 但是 vue3的组合式Api没有this 如何使用呢

    1. <template>
    2. <div class="son">
    3. <h3>子组件</h3>
    4. <button @click="gettop('奥特曼')">send</button>
    5. </div>
    6. </template>
    7. <script lang="ts" setup name="son">
    8. import { defineEmits} from 'vue';
    9. let $emit= defineEmits(['send'])
    10. const gettop=(data:string)=>{
    11. $emit('send',data)
    12. }
    13. </script>

    是通过 defineEmit 来进行自定义事件  在父组件中再进行触发

    1. <template>
    2. <div class="father">
    3. <h1>Emit</h1>
    4. <h2>父组件</h2>
    5. <Son @send="fn"/>
    6. {{ toy }}
    7. </div>
    8. </template>
    9. <script lang="ts" setup name="father">
    10. import { ref } from 'vue';
    11. import Son from './Son.vue'
    12. let toy=ref('')
    13. let fn=(value:string)=>{
    14. toy.value=value
    15. }
    16. </script>

    子组件中定义的什么事件 就在父组件中触发什么事件

    3 兄弟传参

     含义 有共同父组件的两个子组件之间利用全局事件总线进行通讯

    实现方法 先下载 全局事件总线

    npm install mitt -S   

    建立一个ts文件, 或者建立一个文件夹 ,我这里直接建立了一个文件

    在mitt.ts中加入以下代码

    1. import mitt from "mitt";
    2. // 创建mitt实例
    3. const emitter = mitt();
    4. export default emitter;

    在Son.vue中

    1. <template>
    2. <div class="son">
    3. <h3>孩子1</h3>
    4. <button @click="send">send</button>
    5. </div>
    6. </template>
    7. <script lang="ts" setup>
    8. import emitter from './mitt';
    9. let send=()=>{ emitter.emit('send','我是孩子1我发送了数据')}
    10. </script>

    在son2 中

    1. <template>
    2. <div class="son2">
    3. <h3>孩子2</h3>
    4. </div>
    5. </template>
    6. <script lang="ts" name="son2" setup>
    7. import emitter from './mitt'
    8. import {onMounted} from 'vue'
    9. onMounted(()=>{
    10. emitter.on('send',(data)=>{
    11. console.log('孩子2收到数据',data)
    12. })
    13. })
    14. </script>

    其他的传值,可以用 pinia或vuex这两个可以实现全局的组件通讯,一般只要不是父子组件的关系

    vue3 都建议采用  pinia的方式进行组件通讯

  • 相关阅读:
    有哪些可以投稿软件工程/系统软件/程序设计语言类外文期刊、会议?
    强化学习代码实战---多臂赌博机---AttributeError: ‘EntryPoints‘ object has no attribute ‘get‘
    【洛谷 P1029】[NOIP2001 普及组] 最大公约数和最小公倍数问题 题解(更相减损术)
    国密sm2的Vue、Python、Java互通使用
    中高级Java程序员,你不得不掌握的基本功,挑战20k+
    突破亚马逊智能检测,全自动化运营的新利器:亚马逊鲲鹏系统
    道可云元宇宙每日资讯|中国移动启动算网大脑“天穹”全网试商用
    AOP面向切面编程
    小程序打点案例分享总结
    年底旺季,Shopee、Lazada如何通过测评补单技术打造产品权重收割流量
  • 原文地址:https://blog.csdn.net/2301_80044589/article/details/139339760