ホームページ >ウェブフロントエンド >jsチュートリアル >Vue で BroadcastChannel API を使用して複数のタブ間で参照を同期する

Vue で BroadcastChannel API を使用して複数のタブ間で参照を同期する

DDD
DDDオリジナル
2024-12-04 10:52:10665ブラウズ

Using BroadcastChannel API with Vue to sync a ref across multiple tabs

私たちは、開発者だけでなく、チーム全員の時間を節約するよう努めています。クライアントやデモ用にアプリの構成に多くの時間を費やしている人もいます。そのため、私たちはそれができるだけスムーズであることを確認しています。可能。たとえば、すべての変更をリアルタイムで行うよう努めているため、変更を表示するためにアプリをリロードする必要はありません。

最近、これらのユーザーは通常複数のタブを開いて作業しており、アプリの複数のページで構成が期待どおりに機能することを確認していることがわかりました。そこで、タブ間で設定を同期することを考えました。

セッションやローカル ストレージなどに保存することは望ましくありませんでした。保存すると、常に最新の状態であることを確認する必要があります。

私たちが BroadcastChannel API に出会ったのはその時でした。私はそれが存在することさえ知りませんでした。これはそれほど新しいものではありませんが、CanIUse によると、Safari が最後に実装したものです。とにかく、現在は大部分がサポートされています。これは、iframe の古き良き window.postMessage() と同じように考えることができますが、同じオリジンの複数のタブにまたがります。

幸いなことに、VueUse は、使用を容易にするためにすでに少しコンポーザブルを作成しています: https://vueuse.org/core/useBroadcastChannel/#usebroadcastchannel

const {
  isSupported,
  channel,
  post,
  close,
  error,
  isClosed,
} = useBroadcastChannel({ name: 'unique-name' })

そこで、これに基づいて小さな社内コンポーザブルを作成し、参照がすべてのタブ間で常に同期されるようにしました。

import { useBroadcastChannel, watchPausable } from '@vueuse/core';
import { nextTick, watch } from 'vue';

import type { Ref } from 'vue';

export const useSync = <T>(value: Ref<T>, name: string, options?: { immediate?: boolean; deep?: boolean }) => {
  // Name must be unique
  const { post, data } = useBroadcastChannel<T, T>({ name });

  // When value changes locally, update other tabs
  const { pause, resume } = watchPausable(
    () => value.value,
    (newValue) => {
      post(structuredClone(newValue));
    },
    options,
  );

  // When value changes in another tab, update it locally
  watch(
    () => data.value,
    async (newValue) => {
      // Prevent watch loop when updating config
      pause();
      value.value = newValue;
      await nextTick();
      resume();
    },
    options,
  );
};

これで、単一行で ref を同期できるようになりました。

const config = ref({})
useSync(config, 'config', { deep: true });

そして出来上がりです!チーム全体で毎月数時間を節約できることになります?

以上がVue で BroadcastChannel API を使用して複数のタブ間で参照を同期するの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。