Logo

    ©ゆとりちゃれんじ

    GitHubXInstagram

    Next.jsの忘備録

    はじめに

    ゆとり世代の中野です。

    さっそくチャレンジについて書いていきます。

    チャレンジする背景

    • 忘備録

    チャレンジ内容

    • すぐに思い出して使えるようにする

    やったこと

    Supabase

    ‣
    ブラウザでテーブルを編集してマイグレーションファイルを作成したい
    supabase db diff --use-migra -f マイグレーションファイル名
    ‣
    localのマイグレーションをSaaS上のDBに反映させたい

    ローカル開発環境とリモートサーバーをつなげる。

    supabase link --project-ref <project-id>

    supabase link --project-ref ********* -p ******

    • pはリモートサーバーのデータベースパスワードのオプション
    ‣
    初回のマイグレーションファイルの作成方法

    migration newコマンドを使用する

    supabase migration new [マイグレーションファイルの接尾語]

    例

    supabase migration new test001

    を実行すると

    [タイムスタンプ]_[マイグレーションファイルの接尾語].sql

    実行例

    20220829182819_test001.sql

    という形式でマイグレーションファイルが作成される。

    ‣
    2 回目以降のマイグレーションファイルの作成方法

    次回からは diff コマンドを使用して設計データの差分を取っていく。

    supabase db diff -f file01

    を実行すると

    実行例

    20220829183122_file01.sql

    というマイグレーションファイルが作成される。

    ‣
    リモートのマイグレーションを戻したい

    リモートのマイグレーションを戻すコマンドとしてはsupabase migration repairを使って可能です。

    ‣
    リモートにマイグレーションを反映する

    SSR

    ‣
    URLのIDや値を取得したい

    URL /user/{userId}

    import { useParams } from "next/navigation";
    
    export const Page = () => {
      const params = useParams();
      const userId = params.userId
    ...
    
    import { useSearchParams } from "next/navigation";
    
    export const Page = () => {
      const searchParams = useSearchParams();
      const userId = searchParams.get("userId");
    ...
    ‣
    URLのパスパラメータやクエリパラメータを取得したい

    URL /user/{userId}?status=active

    export default function Page({
      params,
      searchParams,
    }: {
      params: { userId: string };
      searchParams: { [key: string]: string | string[] | undefined };
    }) {
      const status = searchParams.status;
    ...
    ‣
    ボタンのonClick関数を付与したい
    • ハイドレーションするためClientComponentを作成する
    • "use client";
      
      import { Button } from "@/components/ui/button";
      import { FC } from "react";
      
      export const ClientButton: FC = () => {
        const handleClick = async () => {
          console.log("Clickされました");
        };
        return (
          <Button onClick={handleClick}>
      			Click
          </Button>
        );
      };
    • 上記のComponentをSSRのComponent内でインポートして利用する
    • import { FC } from "react";
      import { ClientButton } from "./ClientButton";
      
      export const Page: FC = () => {
        return (
          <ClientButton />
        );
      };

    CSR

    ‣
    "use client"; で async/awaite を使ってはいけない

    以下のようなエラーが表示される

    Error: async/await is not yet supported in Client Components, only Server Components. This error is often caused by accidentally adding `'use client'` to a module that was originally written for the server.

    クライアントコンポーネント内でasync/awaitを使用することはできません。

    ‣
    URLのクエリパラメータを取得したい

    URL /user/{userId}?status=active

      import { useSearchParams } from "next/navigation";
      
      export default function PageContent() {
        const searchParams = useSearchParams();
    	  console.log("searchParams: ", searchParams);
      } 

    結論

    さいごに

    yutanakano

    WEBエンジニア

    大阪生まれのゆとり世代です

    趣味はバイクでツーリングに行くこと

    愛車は Ninja ZX-25R SE KRT EDITION

    Expoでプロダクトを作っています

    image