useTitle.ts 810 字节
Newer Older
陈文彬 已提交
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
import type { Ref } from 'vue';

import { ref, watch } from 'vue';
import { tryOnUnmounted } from '/@/utils/helper/vueHelper';
import { isString } from '/@/utils/is';

export function useTitle(overrideTitle: string | null = null): Ref<string | null> {
  const title = ref<string | null>(isString(overrideTitle) ? overrideTitle : document.title);
  const observer = new MutationObserver((m) => {
    title.value = m[0].target.textContent;
  });

  watch(
    title,
    (t, o) => {
      if (isString(t) && t !== o) {
        document.title = t;
      }
    },
    {
      immediate: true,
      flush: 'sync',
    }
  );

  const titleElement = document.querySelector('title')!;
  observer.observe(titleElement, { childList: true });
  tryOnUnmounted(() => {
    observer.disconnect();
  });
  return title;
}