Broadcast Channel API
Пользователи могут открыть одно и то же приложение в нескольких вкладках одновременно. В некоторых случаях может потребоваться синхронизировать данные между этими вкладками.
Типичный пример - выход из системы. Пользователи могут выйти из системы в одной вкладке и остаться в системе во второй вкладке. Несмотря на то, что они вышли из системы на сервере, приложение в соседней вкладке не обрабатывает выход и далее будет показывать интерфейсы, которые должны быть скрыты.
Для решения таких задач может использоваться Broadcast Channel API. Он позволяет обмениваться сообщениями между контекстами просмотра с тем же происхождением (окна, вкладки, фреймы и iframe) в нашем приложении.
Рассмотрим простейший пример использования:
const authChannel = new BroadcastChannel('authChannel');
authChannel.addEventListener('message', () => {
logout();
})
export function logout() {
// logout logic
}
logoutButton.addEventListener('click', () => {
authChannel.postMessage('logout');
logout();
});Все вкладки, кроме текущей, получат событие и вызовут логику выхода из системы. Также этот функционал можно использовать для синхронизации данных между вкладками, например:
import { render } from 'solid-js/web';
import { createSignal, For, onCleanup } from 'solid-js';
const todosChannel = new BroadcastChannel('todos');
function Todos() {
const listener = todosChannel.addEventListener('message', e => {
setTodos(e.data)
});
const [todos, setTodos] = createSignal(['One']);
const addTodo = () => {
setTodos(todos => [...todos, Math.random().toString()]);
todosChannel.postMessage(todos());
}
onCleanup(() => {
todosChannel.removeEventListener('message', listener);
})
return (
<>
<button onClick={addTodo}>Add Todo</button>
<For each={todos()}>
{(item) => <div>{item}</div>}
</For>
</>
)
}
render(() => <Todos />, document.getElementById('root'));