From 4cae2fa4ebf821a7542102e8b703b6cef3b32ca6 Mon Sep 17 00:00:00 2001 From: Seymour Zhang Date: Fri, 15 Nov 2019 13:48:13 +0800 Subject: [PATCH 1/2] Update useTitle.ts Restore the previous title when the current component is destroyed --- src/useTitle.ts | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/src/useTitle.ts b/src/useTitle.ts index 6d3af7e2..718b65df 100644 --- a/src/useTitle.ts +++ b/src/useTitle.ts @@ -1,11 +1,14 @@ import { useRef } from 'react'; function useTitle(title: string) { - const t = useRef(); - - if (t.current !== title) { - document.title = t.current = title; - } + let prevTitleContainer = useRef(); + prevTitleContainer.current = document.title; + document.title = title; + useEffect(()=>{ + return ()=>{ + document.title = prevTitleContainer.current; + } + }); } export default typeof document !== 'undefined' ? useTitle : (_title: string) => {}; From 8faa71f9ac9804f90024d7482103b186dcf71f9a Mon Sep 17 00:00:00 2001 From: zsh2401 Date: Tue, 14 Jan 2020 14:47:58 +0800 Subject: [PATCH 2/2] useTitle could restore title optionally --- src/useTitle.ts | 30 ++++++++++++------- tests/{useTitle.test.tsx => useTitle.test.ts} | 12 ++++++++ 2 files changed, 31 insertions(+), 11 deletions(-) rename tests/{useTitle.test.tsx => useTitle.test.ts} (51%) diff --git a/src/useTitle.ts b/src/useTitle.ts index 718b65df..9e421b2d 100644 --- a/src/useTitle.ts +++ b/src/useTitle.ts @@ -1,14 +1,22 @@ -import { useRef } from 'react'; - -function useTitle(title: string) { - let prevTitleContainer = useRef(); - prevTitleContainer.current = document.title; - document.title = title; - useEffect(()=>{ - return ()=>{ - document.title = prevTitleContainer.current; - } - }); +import { useRef, useEffect } from 'react'; +export interface UseTitleOptions { + restoreOnUnmount?: boolean; +} +const DEFAULT_USE_TITLE_OPTIONS: UseTitleOptions = { + restoreOnUnmount: false, +}; +function useTitle(title: string, options: UseTitleOptions = DEFAULT_USE_TITLE_OPTIONS) { + const prevTitleRef = useRef(document.title); + document.title = title; + useEffect(() => { + if (options && options.restoreOnUnmount) { + return () => { + document.title = prevTitleRef.current; + }; + } else { + return; + } + }, []); } export default typeof document !== 'undefined' ? useTitle : (_title: string) => {}; diff --git a/tests/useTitle.test.tsx b/tests/useTitle.test.ts similarity index 51% rename from tests/useTitle.test.tsx rename to tests/useTitle.test.ts index 4ab4b902..d2ec53af 100644 --- a/tests/useTitle.test.tsx +++ b/tests/useTitle.test.ts @@ -13,4 +13,16 @@ describe('useTitle', () => { hook.rerender('My other page title'); expect(document.title).toBe('My other page title'); }); + + it('should restore document title on unmount', () => { + renderHook(props => useTitle(props), { initialProps: 'Old Title' }); + expect(document.title).toBe('Old Title'); + + const hook = renderHook(props => useTitle(props.title, { restoreOnUnmount: props.restore }), { + initialProps: { title: 'New Title', restore: true }, + }); + expect(document.title).toBe('New Title'); + hook.unmount(); + expect(document.title).toBe('Old Title'); + }); });