对于(Next.js)开发的备忘录

React(Next.js)开发备忘录

由于是第一次参与React项目,所以写下这个备忘录。

反应钩子

使用状态

const [data, setData] = useState<Data[]>([]); //引数は初期値

笔记:data中包含数据的指针(内存地址),实际数据在每次设置setData时都会被新建,并更新data的指针。

useEffect的用法

useEffect(() => {
  console.log('dataが変更されました:', count);
}, [依存1, 依存2, 依存3...]); // 依存配列の監視対象の値が変わるたびに実行される。
useEffect(() => {
  console.log('dataが変更されました:', count);
}, []); // 依存配列に空配列を指定すると、初回マウント時に1度だけ実行される。

备注:使用副作用来描述。当A发生变化时,以异步的方式执行B的处理。第一个参数是处理B,第二个参数是依赖数组[A]。

使用上下文

import React, { createContext, useState, ReactNode } from 'react';

interface MessageContextType {
  message: ReactNode;
  showMessage: (msg: ReactNode) => void;
}

export const MessageContext = createContext<MessageContextType | null>(null);

interface MessageProviderProps {
  children: ReactNode;
}

export const MessageProvider: React.FC<MessageProviderProps> = ({ children }) => {
  const [message, setMessage] = useState<ReactNode>(null);

  const showMessage = (msg: ReactNode) => {
    setMessage(msg);
  };

  const contextValue = {
    message,
    showMessage
  };

  return (
    <MessageContext.Provider value={contextValue}>
      {children}
    </MessageContext.Provider>
  );
};

使用消息.tsx

下面是自定义钩子 useMessage 的定义。

import { useContext } from 'react';
import { MessageContext, MessageContextType } from './MessageContext';

export const useMessage = () => {
  const context = useContext(MessageContext);
  if (!context) {
    throw new Error('useMessage must be used within a MessageProvider');
  }
  return context as MessageContextType;
};

你的组件.tsx

这是一个定义用于显示消息组件的语句。

import React from 'react';
import { useMessage } from './useMessage';

export const YourComponent: React.FC = () => {
  const { showMessage } = useMessage();

  return (
    <div>
      <button onClick={() => showMessage(<p>メッセージ</p>)}>
        Show Message
      </button>
    </div>
  );
};

应用.tsx

这是应用程序的根组件的定义。

import React from 'react';
import { MessageProvider } from './MessageContext';
import { YourComponent } from './YourComponent';

const App: React.FC = () => {
  return (
    <MessageProvider>
      <YourComponent />
    </MessageProvider>
  );
};

export default App;

以下是Next.js的目录示例。

├── public                          # 静的ファイルを格納
│   ├── icons                       # アイコンファイル
│   └── images                      # 画像ファイル
└── src                             # ソースコード
    ├── actions                     # Reduxアクションの定義
    ├── app                         # アプリケーションの主要機能やページ
    │   ├── (loggedin)              # ログイン後のユーザー専用コンテンツ ※
    │   ├── lib                     # 汎用ライブラリやヘルパー関数
    │   ├── login                   # ログイン機能関連
    │   │   └── component           # ログイン機能に関連するコンポーネント
    │   ├── function_a              # A機能関連
    │   │   ├── component           # A機能に関連するコンポーネント
    │   │   ├── a_1                 # a_1機能
    │   │   └── a_2                 # a_2機能
    │   ├── function_b              # B機能関連
    │   │   ├── component           # B機能に関連するコンポーネント
    │   │   ├── b_1                 # b_1機能
    │   │   └── b_2                 # b_2機能
    │   ├── function_c              # C機能関連
    │   │   ....続く
    │   └── test                    # テストコード
    ├── components                  # UIコンポーネント
    │   ├── atoms/                  # 最も基本的なUI要素
    │   │   ├── Button/
    │   │   ├── Icon/
    │   │   ├── Input/
    │   │   └── ...                 # その他の原子レベルのコンポーネント
    │   ├── molecules/              # 原子を組み合わせたコンポーネント
    │   │   ├── SearchBar/
    │   │   ├── UserCard/
    │   │   ├── FormField/
    │   │   └── ...                 # その他の分子レベルのコンポーネント
    │   ├── organisms/              # 分子を組み合わせたより複雑なコンポーネント
    │   │   ├── Header/
    │   │   ├── Footer/
    │   │   ├── ProductList/
    │   │   └── ...                 # その他の有機体レベルのコンポーネント
    │   └── templates/              # ページのレイアウトを定義
    │       ├── DefaultLayout/
    │       ├── BlogLayout/
    │       └── ...                 # その他のテンプレート
    ├── constants                   # 定数の定義
    ├── context                     # Reactコンテキストの定義
    ├── gql                         # GraphQLのスキーマやフラグメント
    ├── graphql                     # GraphQLクエリとミューテーション
    │   ├── mutations               # GraphQLミューテーション
    │   └── queries                 # GraphQLクエリ
    ├── hooks                       # カスタムReactフック
    ├── middleware                  # ミドルウェア関連の設定や関数
    ├── providers                   # コンテキストプロバイダー
    ├── stores                      # Reduxやその他の状態管理ストア
    ├── styles                      # スタイルシート(CSSやSASS)
    └── utils/                      # ユーティリティ関数を格納
        ├── dateConverters.ts       # 日付関連の変換関数
        ├── mathHelpers.ts          # 数学的なヘルパー関数
        └── ...                     # その他のユーティリティ関数

备忘录:在传统的Next.js中,创建项目时会生成一个名为”pages”的文件夹。但是在Next.js 13中,如果要使用”app”文件夹的功能,则需要一个名为”app”的文件夹,而不是”pages”。

共通组件

我总结了一下,不知道将共享文件放在哪里合适。

源代码/应用程序库

用途: pages 内で共通して使用される機能やヘルパー関数を配置します。

例: 特定のページでのみ使用されるデータ取得関数やページ固有のロジック。

源代碼/應用/函數A/組件。

用途: 特定の機能(この例では functionA)に関連するコンポーネントを配置します。

例: functionA 関連のページ部品やレイアウトコンポーネント。

原子组件

用途: 最も基本的なUI要素(ボタン、ラベル、入力フィールドなど)を配置します。

例: 汎用的なボタン、アイコン、ラベル。

源代碼/元件/分子化組件

用途: 複数の atoms を組み合わせたUIコンポーネントを配置します。

例: フォームフィールド(ラベル + 入力フィールド)、ユーザーカード(アバター + ユーザー名 + ユーザー情報)。

源代码/组件/有机体

用途: 複数の molecules(または atoms)を組み合わせて、より複雑なUIセクションを構築します。

例: ナビゲーションバー(ロゴ + メニューアイテム)、製品リスト(製品カードの集合)。

源码/工具类

用途: アプリケーション全体で共通して使用されるユーティリティ関数やヘルパー関数を配置します。

例: 日付のフォーマット変更、数値のフォーマット変更、APIリクエスト関数。

配置的重点 de

再利用性と範囲: atoms、molecules、organisms はUIコンポーネントの再利用性と範囲に基づいて配置されます。atoms は最も基本的で、organisms は最も複合的です。

特定の機能に焦点を当てる: src/app/functionA/component のようなディレクトリは、特定の機能や機能セットに焦点を当てたコンポーネントをグループ化します。

共通機能とユーティリティ: src/app/lib と utils は、機能やヘルパー関数をグループ化しますが、範囲が異なります。src/app/lib はページ特有の機能に対して、utils はアプリケーション全体に跨る機能に対して使用されます。(src/app/lib=画面特有, utils=画面も画面以外の処理でも使用)

应用程序路由器

1. 服务器组件 qì

使用’server-only’选项可以明确指定仅在服务器上执行的“Secure处理”(不希望在客户端执行的处理)、数据获取组件。例如,身份验证、API执行和获取时间等。

2. 客户组件

如果需要管理状态,那么客户端组件就必要。

原子设计

原子,分子

服务器组件(无需使用数据获取和状态)

除此之外

通常的定义来说

关于GraphQL。

追踪

重现

我会追赶。

退避

追踪不断

故事书

追寻

剧作家

你追我逐。

广告
将在 10 秒后关闭
bannerAds