2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

1人フロントエンドAdvent Calendar 2023

Day 16

<title>を変更するhooks

Last updated at Posted at 2023-12-15

ReactでCSR単体の開発を行う場合<title>要素の管理をJavaScript側から行う必要があります。
ページ・コンポーネントごとに<title>を設定するようにしても良いですが、hooksとして切り出して再利用したいです。
この記事では<title>を設定することと、アンマウント時にタイトルを元の状態に戻せるようなhooksを紹介します。

<title>にはdocument.titleでアクセスできます。そして、document.titleに文字列を渡すことで値の設定ができます。
そのため、SampleComponentコンポーネントをマウントした時に<title>を設定するには以下のようにします。

const SampleComponent: FC = () => {
  useEffect(() => {
    document.title = 'サンプル';
  }, []);

  return <></>;
};

これをhooksに抜き出すと以下のようになります。

const useTitle = (title: string) => {
  useEffect(() => {
    document.title = title;
  }, [title]);
};

これで、コンポーネントがマウントされた時にタイトルの設定が可能になりました。
このままでは、コンポーネントがアンマウントされた時もタイトルを維持してしまいます。任意でアンマウントするタイミングに元のタイトルへ戻せるようにしていきます。

const useTitle = (title: string, restorePrevTitle = false) => {
  const prevTitle = useRef<string>(document.title);

  useEffect(() => {
    if (prevTitle.current === title) {
      return;
    }
    document.title = title;

    return () => {
      if (restorePrevTitle) {
        document.title = prevTitle.current;
      }
    }
  }, [title]);
};

新たにrestorePrevTitleを引数に取り、trueの場合はアンマウント時に元のタイトルへ戻るようにしました。
<title>を変更する前の値はrefに渡すことにより、レンダリング間で保持させています。そして、アンマウント時にその値をdocument.titleに渡すことで元のタイトルへ戻すようにしました。

このhooksを使うときは同時に複数のコンポーネントで利用しないことです。複数のコンポーネントで利用した場合はそれぞれのライフサイクルなどのタイミングによって設定されるタイトルが一意に定まらないことが多いので気をつけてください。

2
3
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?