フロントエンド コードリーディング2023年11月 - Hashimoto-Noriaki/react-guide-training GitHub Wiki

1

import React from "react";
import Link from "next/link";
import { User } from "@/interfaces/UserType";
import { StyledTableBody } from "@/components/common/StyledTable";

const formatDate = (date: Date) => {
  const year = date.getFullYear();
  const month = String(date.getMonth() + 1).padStart(2, "0");
  const day = String(date.getDate()).padStart(2, "0");
  return `${year}/${month}/${day}`;
};

//formatDate 関数:
//formatDate 関数は、日付(Date型)を指定されたフォーマットで文字列に変換するためのユーティリティ関数です。
//date.getFullYear() メソッドは、与えられた日付から年を取得します。例えば、2023年の場合、year 変数には 2023 が格納されます。
//date.getMonth() メソッドは、月を 0 から始まるインデックスで取得します。例えば、1月は 0、2月は 1、3月は 2 となります。それを考慮して、date.getMonth() + 1 として、1月から12月までの正確な月を取得します。
//date パラメータは、フォーマットする日付です。この関数は、年、月、日の情報を取得し、yyyy/mm/dd の形式で文字列を返します。
//String(date.getMonth() + 1).padStart(2, "0") は、月を 2 桁の文字列として表現するためのコードです。
//String() メソッドで数値を文字列に変換し、padStart() メソッドを使用して文字列を 2 桁にパディングします。
//例えば、1月は "01" となります。同様に、date.getDate() メソッドで日を取得

type Props = {
  user: User;
};
//Props 型:
//Props 型は、ListItem コンポーネントが受け取るプロパティ(props)の型を定義するための TypeScript の型です。この場合、user プロパティが User 型であることが期待されています。

const ListItem: React.FC<Props> = ({ user }: Props) => {
  return (
    <>
      <StyledTableBody
        component="td"
        scope="row"
        align="left"
        style={{ cursor: "pointer" }}
      >
        <Link href={`/users/${user.slack_id}`}>{user.slack_name}</Link>
      </StyledTableBody>

     // ListItem コンポーネント:
//ListItem コンポーネントは、関数コンポーネントとして宣言されています。Props 型のプロパティ user を引数として受け取ります。
//StyledTableBody コンポーネントを使用して、テーブルの行を表現します。この行はユーザー情報を表示するためのものです。StyledTableBody は、デザインのスタイリングが適用されたテーブルセルです。
//Link コンポーネントを使用して、ユーザー名をリンクに変換します。ユーザー名をクリックすると、指定されたURL(/users/${user.slack_id})に遷移します。ユーザーの Slack ID を使用して、ユーザーの詳細ページにリンクします。

2

import { useState, useEffect } from "react";

async function fetchUsersData() {
  // ISSUE: Railsからユーザーの情報を取得するように後々修正する
  try {
    const response = await fetch("/api/getUsersData");
    if (!response.ok) {
      throw new Error("ネットワークエラー");
    }
    const data = await response.json();
    return data;
  } catch (error) {
    console.error("エラー:", error);
    throw error;
  }
}

//async function fetchUsersData() { ... }: 非同期関数の宣言を始めます。非同期関数はasyncキーワードで始まり、非同期操作を含むコードを定義できる関数です。

//try { ... } catch (error) { ... }: エラーハンドリングのためのtry-catchブロックです。tryブロック内のコードは、エラーが発生するかもしれない操作を含んでいます。エラーが発生した場合、catchブロック内のコードが実行されます。

//const response = await fetch("/api/getUsersData");: fetch関数を使用して、指定されたURL ("/api/getUsersData") からデータを取得しようとしています。awaitキーワードを使用して、fetch関数の非同期操作が完了するのを待ちます。この操作はHTTPリクエストを送信し、APIからデータを受け取ることを試みます。

//if (!response.ok) { throw new Error("ネットワークエラー"); }: 取得したHTTP応答のステータスコードが成功 (200 OK) でない場合、つまりネットワークエラーが発生した場合、エラーメッセージとともにエラーをスローします。

//const data = await response.json();: HTTP応答からJSONデータを読み取り、data変数に格納しています。この操作も非同期であり、awaitを使用して完了を待ちます。

//return data;: JSONデータが正常に取得された場合、このデータを呼び出し元に返します。

//console.error("エラー:", error); throw error;: エラーハンドリングの一部として、エラーメッセージと共にエラーをコンソールに出力し、エラーを再スローします。これにより、エラーが呼び出し元に伝播し、エラーハンドリングが可能となります。

//この関数は、HTTPリクエストを送信してAPIからデータを取得し、取得したデータを呼び出し元に返します。また、ネットワークエラーが発生した場合に備えてエラーハンドリングも行っています。このコードは、フロントエンドでバックエンドAPIとの通信を行う際に非常に一般的なアプローチです。

export default function useFetchUsersData() {
  const [usersData, setUsersData] = useState([]);
  const [error, setError] = useState(null);

  useEffect(() => {
    fetchUsersData()
      .then((data) => {
        setUsersData(data);
        setError(null);
      })

      .catch((error) => {
        setError(error);
      });
  }, []);

  return { usersData, error };

  //ユーザーデータを取得するためのカスタムフック(useFetchUsersData)を定義しています。以下はこのコードの詳細な解説です。

//export default function useFetchUsersData() { ... }: カスタムフックの宣言を始めます。このフックは、ユーザーデータの取得とエラーハンドリングを担当します。

//const [usersData, setUsersData] = useState([]);: useState フックを使用して、usersData という状態変数と、その状態変数を更新するための setUsersData 関数を定義します。usersData はユーザーデータを保持します。

//const [error, setError] = useState(null);: 同様に、エラー情報を保持するための error 状態変数と、エラー情報を更新するための setError 関数を定義します。初期値は null です。

//useEffect(() => { ... }, []);: useEffect フックを使用して、副作用の実行タイミングを管理します。この useEffect は初回のレンダリング時に一度だけ実行されるように [] という空の依存リストが指定されています。

//fetchUsersData().then((data) => { ... }).catch((error) => { ... });: fetchUsersData 関数を呼び出し、その非同期操作の結果を処理します。

//fetchUsersData 関数が非同期でユーザーデータを取得し、成功した場合は .then ブロックが実行されます。取得したデータは data として受け取り、setUsersData を使用して usersData 状態変数にセットされ、同時に error は null にクリアされます。

//ユーザーデータの取得に失敗した場合は、.catch ブロックが実行されます。エラーオブジェクトが error 状態変数にセットされ、usersData は変更されません。

//return { usersData, error };: カスタムフックが提供する戻り値です。このフックは usersData(ユーザーデータ)と error(エラー情報)の現在の状態を返します。コンポーネント内でこのフックを使用すると、ユーザーデータとエラー情報にアクセスできます。

//このカスタムフックを使用すると、コンポーネントでユーザーデータを非同期に取得する際に、データの取得とエラーハンドリングが単純化されます。コンポーネントは usersData と error の値を参照し、必要に応じて表示やエラーメッセージを処理できます。





⚠️ **GitHub.com Fallback** ⚠️