ECMaker / blog

https://blog.ec-maker.com/
0 stars 0 forks source link

ToCスマホ対応 #75

Closed u-ecmaker closed 4 months ago

u-ecmaker commented 4 months ago

スマホ表示にしたときでもToCが表示される

zennのようなイメージ
image

u-ecmaker commented 4 months ago

Reactの状態管理を使用して、TableOfContentsの表示/非表示を制御することができます。具体的には、useStateフックを使用して表示状態を管理し、ContentsButtonがクリックされたときにその状態を切り替えます。

まず、PostDetailTemplate.tsx で新しい状態変数を作成します。

次に、TableOfContentsの表示をこの状態に基づいて制御します。

最後に、ContentsButtonにonClickプロップを追加して、ボタンがクリックされたときにshowTableOfContentsを切り替えるようにします。

ただし、これを行うにはContentsButtonがonClickプロップを受け取るように変更する必要があります。

これで、ContentsButtonがクリックされるとTableOfContentsの表示が切り替わります。

src\components\@templates\PostDetailTemplate.tsx

export const PostDetailTemplate: FC<Props> = ({ post, comments, onSubmit }) => {
  const [showTableOfContents, setShowTableOfContents] = useState(false);

  return (

      <div className="">
        <ContentsButton onClick={() => setShowTableOfContents(prev => !prev)} />
      </div>
        <div className="w-aside">
          <Bio />
          <div className="sticky top-[52px] mt-4 space-y-4">
            {showTableOfContents && <TableOfContents blocks={post.children} />}
            <PostMeta meta={post} commentCount={comments.length} />
          </div>
        </div>
      </div>
    </div>
  );
};

src\components\@layouts\ContentsButton.tsx ContentsButton.tsxのコードには誤りがあります。onClickプロパティはbutton要素に適用する必要があります。 ContentsButtonコンポーネントは親コンポーネントから渡されたonClick関数を実行します。これにより、ボタンがクリックされたときに親コンポーネントで定義された動作(この場合はTableOfContentsの表示切り替え)が実行されます。

import type { FC } from 'react';

type Props = {
  onClick: () => void;
};
export const ContentsButton: FC<Props> = ({ onClick }) => {

  return (
    <button
      className="flex cursor-pointer items-center gap-2 sp:gap-1 rounded-md border-none bg-gray-700 px-2 py-1.5 font-Baloo text-base text-white shadow hover:brightness-125"
      onClick={onClick}
    >
      Contents
    </button>
  );
};
u-ecmaker commented 4 months ago

Layout.tsxからPostDetailTemplate.tsxへ状態を渡すためには、Reactのコンテクストを使用するのが一般的な方法です。これにより、アプリケーションの任意の深さのコンポーネント間で状態を共有することができます。

まず、新しいコンテクストを作成します。このコンテクストは、showTableOfContentsの状態とその状態を更新するための関数を提供します。

GitHub Copilot Layout.tsxからPostDetailTemplate.tsxへ状態を渡すためには、Reactのコンテクストを使用するのが一般的な方法です。これにより、アプリケーションの任意の深さのコンポーネント間で状態を共有することができます。

まず、新しいコンテクストを作成します。このコンテクストは、showTableOfContentsの状態とその状態を更新するための関数を提供します。

次に、アプリケーションのルートレベルでTableOfContentsProviderを使用します。これにより、アプリケーションのどのコンポーネントからでもshowTableOfContentsの状態にアクセスできます。