在Vue3开发中,BroadcastChannel API
提供了一种跨浏览器上下文(如不同标签页、iframe)的通信机制,适用于需要实时同步数据的场景。以下是对其使用场景、常见问题及最佳实践的详细说明:
1. BroadcastChannel API 基础
- 作用:允许同源下的不同浏览器上下文通过命名频道进行通信。
- 核心方法:
new BroadcastChannel(name)
:创建/加入频道。postMessage(data)
:发送消息。onmessage
:接收消息。close()
:关闭频道。
2. 常见使用场景
2.1 多标签页数据同步
- 场景:用户在一个标签页修改数据,其他标签页自动更新。
- Vue3 实现:
<script setup> import { ref, onMounted, onUnmounted } from 'vue'; const data = ref({}); let channel; onMounted(() => { channel = new BroadcastChannel('data-sync'); channel.onmessage = (event) => { data.value = event.data; // 接收消息更新响应式数据 }; }); // 发送数据变更 const updateData = (newData) => { data.value = newData; channel.postMessage(newData); }; onUnmounted(() => channel?.close()); </script>
2.2 跨组件通信
- 场景:非父子关系的组件间通信(如使用同一频道的不同组件)。
- 优化方案:通过自定义Hook封装逻辑。
// useBroadcastChannel.js import { onUnmounted } from 'vue'; export function useBroadcastChannel(channelName, callback) { const channel = new BroadcastChannel(channelName); channel.onmessage = callback; const post = (data) => channel.postMessage(data); const close = () => channel.close(); onUnmounted(close); return { post, close }; }
<!-- 组件内使用 --> <script setup> import { useBroadcastChannel } from './useBroadcastChannel'; const { post } =