码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • vue3 也有总线传值 (mitt使用闭坑指南)


    vue3 总线传值


    提示:文章仅供参考,具体按照自己的的效果为主

    文章目录

    • vue3 总线传值
    • 零、发现mitt的契机
    • 一、总线传值作用是什么(vue中的传值方式)?
    • 二、Vue2中总线传值的使用
    • 三、Vue3中总线传值的使用
      • 1.通过npm 安装 mitt
        • 安装mitt:
        • 具体操作如下图所示:
      • 2.创建对应的文件
        • 创建mitt实例步骤:
        • 具体如下图内容所示:
      • 3.总线(mitt)的使用
        • 1.组件中的使用方法
          • ①`Childrenone` 代码如下:
          • ②`ChildrenTwo` 代码如下:
          • ③结果图如下所示
    • 四、一定要读这部分(避免踩坑),非常重要!!!!
      • 使用上面的总线出现的问题:
        • 问题描述:
        • 解决方法:
    • 总结:


    零、发现mitt的契机

    一直认为Vue3中不存在实例,就不能像Vue2一样通过:1. 创建一个新的实例,2.创建总线(bus)进行兄弟组件间的传值

    工作中前人的代码项目中添加的一些依赖项,发现了一个mitt的库,当时很好奇就搜索了一下,发现MITT可以用来实现Vue3的总线传值


    提示:以下是本篇文章正文内容,下面案例可供参考

    一、总线传值作用是什么(vue中的传值方式)?

    vue中有很多的传值方式(具体可以看以下链接)
    1.路由传值 四种路由传值的方式
    2.组件间的通信 ①父传子 ②子传父 ③总线传值 ④借助本地存储传值 ⑤通过仓库(vuex、pinia)传值
    3.总线传值就是基于 兄弟组件之间的一种传值方式,避免了我们频繁的通过
    ,儿子1组件 传 父组件 父组件 传 儿子2组件 这样的形式进行 儿子1与儿子2之间的数据关联

    二、Vue2中总线传值的使用

    点击下方连接可跳转

    Vue2中总线的使用方法

    三、Vue3中总线传值的使用

    1.通过npm 安装 mitt

    安装mitt:

    1.通过 npm install mitt 安装mitt
    2.在 package.json文件中检查,是否安装成功

    具体操作如下图所示:

    在这里插入图片描述

    2.创建对应的文件

    创建mitt实例步骤:

    1.创建好文件夹 index.ts(index.js)
    2.通过ES6语法导入mitt import mitt from "mitt"
    3.创建实例
    4.导出实例(这里可以选择自己喜欢的导出方式 exports 或者 export default )

    具体如下图内容所示:

    在这里插入图片描述

    3.总线(mitt)的使用

    此处使用 两个兄弟组件进行传值测试 如下图: Childrenone 和 ChildrenTwo

    在这里插入图片描述

    1.组件中的使用方法

    ①Childrenone 代码如下:
    <template>
        <div style="border:1px solid red ">
            <h2>Childrenone</h2>
            <button @click="addCount">点击我进行总线传值</button>
            <div style="color: blueviolet;">
                点击传给ChildrenTwo的值:{{state.count}}
            </div>
        </div>
    </template>
    
    <script setup lang='ts'>
    //第一步导入  mitt
    import mitter from "@/mitter";
    import { reactive } from "vue";
    
    //第二步:声明一个变量   
    /* ①此处使用的是reactive,②也可以使用ref来声明 */
    const state = reactive({
        count: 0 as number
    })
    
    //第三步:定义一个触发传值的事件
    const addCount = () => {
        state.count++
        //第四步:通过导入的mitt实例调用 emit 的方法
        // 参数一:总线事件的名称,参数二:需要传递的参数
        mitter.emit("addCount", state.count)
    }
    </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
    • 29
    ②ChildrenTwo 代码如下:
    <template>
      <div style="border:1px solid blue; margin-top:16px;">
        <div>
          <h2>ChildrenTwo</h2>
          <div>
            总线传过来的值:{{getAddCount}}
          </div>
        </div>
      </div>
    </template>
    
    <script lang="ts" setup>
    //第一步:在接收的的组件中导入 mitt
    import mitter from "@/mitter/index";
    
    import { Ref, ref } from "vue";
    
    const getAddCount: Ref = ref(0)
    
    //第二步:通过mitt的 on 事件来监听 emit 发射过来的参数
    /* 
    on(参数1,callback) 
    参数一:事件名,
    参数二:回调函数
    */
    mitter.on('addCount', (val: unknown) => {
      getAddCount.value = val
      console.log(val);
    
    })
    
    </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
    • 29
    • 30
    • 31
    • 32
    ③结果图如下所示

    在这里插入图片描述

    四、一定要读这部分(避免踩坑),非常重要!!!

    使用上面的总线出现的问题:

    问题描述:

    使用了mitt的总线传值,emit 和 on 之后,如果你没有对该 总线进行销毁处理,就会出现我下面的这种情况:一次性发送了很多次。

    在这里插入图片描述

    解决方法:

    需要在接收的组件中,添加一行代码去解决这个问题

    // 在组件销毁(销毁前的)的生命周期中添加 `mitter.off()方法去销毁`
    //Vue3中的写法
    onUnmounted(()=>{
      mitter.off('addCount')
    })
    
    • 1
    • 2
    • 3
    • 4
    • 5

    总结:

    这个知识点是我6月份发现的,当时接触的Vue3还不算太熟练.
    希望文章对大家咋学习上会有一些帮助!!!!,祝愿大家早日可以成为技术大牛
    中秋节快乐,GOGOGO!!!!

  • 相关阅读:
    Android项目集成穿山甲开屏/插屏/横幅广告教程大全
    linux syslog日志转发服务端、客户端配置
    台灯到底对眼睛好不好?2022精选眼科医生推荐护眼灯
    JAVA毕业设计ETC用户自驾游推荐系统计算机源码+lw文档+系统+调试部署+数据库
    堪称最全的Java面试笔记(准备+基础+数据库+框架+面经)
    Python处理英文文档(添加音标和翻译)
    C# Socket通信从入门到精通(3)——单个异步TCP客户端C#代码实现
    【Python基础】数据容器的切片操作和集合
    『Halcon与C#混合编程』006_HObject、HOperatorSet、HTuple、HDevWindowStack
    利用随机森林对特征重要性进行评估(公式原理)
  • 原文地址:https://blog.csdn.net/weixin_46022934/article/details/126795155
  • 最新文章
  • 沪漂五周年了:我越来越迷茫了
    Agentic Skill Routing 实战:别再把所有 Skill 塞进 AI Agent 上下文
    MySQL-Seconds_behind_master的精度误差
    [MAF预定义ChatClient中间件-03]CachingChatClient——利用缓存省钱省时间
    AI的至暗历史:从万众期待到被政府撤资,AI的两次死亡徘徊
    Agent OS :五种驯服不确定性的范式
    PortSwigger SQL注入LAB11
    数据库即时编译JIT
    [Begin]AI Learn Data Day 0
    深度学习进阶(二十七)现代 LLM 的核心架构设计其二:SwiGLU
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
小工具 小游戏
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1

京公网安备 11010502049817号