vue跨标签页通信(BroadcastChannel)方案

日常业务开发中我们常常会碰到如下的场景,即两个标签页之间的通信问题。我们在第一个标签页如何执行操作后在第二个标签页获取到信息
在这里插入图片描述

在这里插入图片描述
BroadcastChannel API 为我们提供了一种快捷且高效的途径
首先我们需要创建一个可以在多数环境下都可以快速使用的方法,在工程的任意位置创建一个可以访问的bol.ts/js 文件,当然你可以叫它任何你想叫的名字

1.构建通道

//跨标签页通信方案 ‘Msg’即通道名称,可以是任何你想叫的名称
const bol=new BroadcastChannel('Msg')

2.创建发送及接收的方法

export const sendMsg=(type:string,content:any)=>{
    //传入的内容必须是普通类型 象形式对象进行传输时请转换成普通类型
    bol.postMessage({
        type,
        content
    })
}
//在监听获取方法内部我们需要多考虑一点关闭事件的方式,在空闲或者释放掉标签页面情况下不再执行监听
export const listenMsg = (callback:any)=>{
    const handler=(e:any)=>{
        callback&&callback(e.data)
    }
    bol.addEventListener('message',handler);
    //在组件卸载之后将监听事件关闭
    return () =>{
        bol.removeEventListener('message',handler)
        bol.close();
    }
}

发送消息标签页的使用

    import { sendMsg } from "../../utils/bol";
    
     const setInfo =ref()
     setInfo.value ={ name:"123", code:1 }
     //消息发送
     const handleMsg=(type:number)=>{
                
                sendMsg('fly', setInfo.value)

       }

//接收消息标签页

 import { listenMsg } from "../../utils/bol";
    const clearBol = listenMsg((msg:any)=>{
       console.log('收到',msg)
     })
    //销毁
      onUnmounted(()=>{ clearBol() })

第一次测试
在这里插入图片描述
噶了!! 并没又直接获取到反而在发送的时候就报错了,再仔细看看发送的消息。setInfo.value
这个东西目前是被ref创建并代理的东西,一个引用类型且被代理的东西肯定是不会允许克隆的,毕竟大家指向的地址是同一个
修改一下

    const handleMsg =(type:number) => {
          
          sendMsg('fly', {...setInfo.value})
     }

在这里插入图片描述
成功接收~~

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Vue实现标签组件的基本思路是使用两个组件:Tabs组件和Pane组件。 Tabs组件负责渲染标签的头部,并处理标签的切换逻辑。在Tabs组件中,需要引入一个Vue文件Vuejs_actual_tabs.vue,用于渲染标签切换头。Tabs组件还可以包含一个slot,用于显示当前选中标签的内容。 Pane组件负责渲染标签的内容,并与Tabs组件进行交互。在Pane组件中,需要引入一个Vue文件Vuejs_actual_pane.vue,用于渲染标签显示内容。Pane组件还需要定义一个isShow属性,通过v-show指令来控制内容的显示或隐藏。 在交互方面,点击标签标题时,通过设置isShow属性为true来显示对应的内容。为了识别不同的标签标题,可以在Props中定义一个label属性,用于存放标题。当label值发生变化时,通过监听实现重新初始化标题。可以调用Tabs组件的初始化方法,例如使用this.$parent来调用父组件Tabs的初始化方法。 综上所述,通过Tabs组件和Pane组件的配合,可以实现一个简单的Vue标签组件。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Vue完成标签组件](https://blog.csdn.net/BiangBaing/article/details/118029240)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *2* *3* [说说如何在 Vue.js 中实现标签组件](https://blog.csdn.net/weixin_33708432/article/details/88011159)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值