ユースケース開発React アプリケーションのためのOSDKチュートリアル:高度なToDoアプリケーションUseCodingTaskフック

注: 以下の翻訳の正確性は検証されていません。AIPを利用して英語版の原文から機械的に翻訳されたものです。

useCodingTask フック

useCodingTask フックは、高度な to-do アプリケーションでコーディングタスクのデータを取得して管理する機能を提供するカスタム React フックです。基本的なタスクデータにユーザー情報とメタデータを追加し、コンポーネントが簡単に利用できる包括的なデータ構造を作成します。

useCodingTask フックは、オントロジー SDK を活用して、型安全な方法でバックエンドサービスとやり取りします。強力な $as 演算子を使用し、異なるオブジェクトタイプの実装間でピボットします。また、React の状態管理とメモ化のパターンを効果的に使用して、パフォーマンスを最適化する方法も示しています。

useCodingTask のリファレンスコードを表示する。

主な機能

  • React の useCallback を使用して関数をメモ化し、不要な再レンダリングを防ぎます
  • SWR (stale-while-revalidate) のキャッシュを活用して、冗長な API 呼び出しを減らします
  • 親タスクの ID に紐づく、コンポーネント固有のデータ取得を実装します
  • データとメタデータの両方へのアクセスを提供し、豊かな UI 体験を実現します
  • TypeScript とオントロジー SDK を使用して型安全性を確保します
  • $as 演算子を使用して、オブジェクトタイプ間で型安全にピボットします
  • 自動再検証を無効にして、ネットワーク使用量を最適化します

useCodingTask の構造

インターフェース定義

Copied!
1 2 3 4 5 interface CodingTaskEnriched { osdkCodingTask: osdkCodingTask.OsdkInstance; createdBy: User; assignedTo: User; }

このインターフェースは、SDK のコーディングタスクインスタンスと、タスクの作成者および担当者のユーザーオブジェクトを組み合わせ、コンポーネントの実装を簡素化する統一されたデータ構造を作成します。

データ取得

useCodingTask フックは、次の処理を行うカスタムフェッチャー関数とともに、SWR のデータ取得機能を使用します。

  1. $as 演算子を使用して、コーディングタスクインターフェースの実装にピボットします
  2. 親タスクにすでに含まれているユーザーデータを利用します
  3. 取得したデータから CodingTaskEnriched オブジェクトを構築します
  4. 情報を追加したデータ構造を返し、SWR がキャッシュできるようにします
Copied!
1 2 3 4 5 6 7 8 9 const fetcher = useCallback(async () => { const codingTask = task.osdkTask.$as(osdkCodingTask); const codingTaskEnriched = { osdkCodingTask: codingTask, createdBy: task.createdBy, assignedTo: task.assignedTo, }; return codingTaskEnriched; }, [task]);

useCodingTask フックは、不要なネットワークリクエストを最小限に抑えるように SWR を設定します。

Copied!
1 2 3 4 { revalidateOnFocus: false, revalidateOnReconnect: false, }

メタデータへのアクセス

useCodingTask フックは、オブジェクトタイプのメタデータを取得して、動的な UI 機能を実現します。

Copied!
1 2 3 4 5 6 7 8 const getObjectTypeMetadata = useCallback(async () => { const objectTypeMetadata = await client.fetchMetadata(osdkCodingTask); setMetadata(objectTypeMetadata); }, [client]); useEffect(() => { getObjectTypeMetadata(); }, [getObjectTypeMetadata]);

このメタデータは、コンポーネントがレンダリングに使用できる、コーディングタスクのオブジェクトタイプに関する情報(表示名やフィールド設定など)を提供します。

戻り値

useCodingTask フックは、次の構造を持つオブジェクトを返します。

Copied!
1 2 3 4 5 6 7 { codingTask: CodingTaskEnriched | undefined; // 情報を付加したコーディングタスク(未読み込みの場合は undefined) isLoading: boolean; // 初回のデータ読み込み中は true isValidating: boolean; // バックグラウンドでの再検証中は true isError: any; // リクエストに失敗した場合のエラーオブジェクト metadata: ObjectMetadata | undefined; // コーディングタスクのオブジェクトタイプに関するメタデータ }

この包括的な戻り値により、コンポーネントはさまざまな状態を処理し、適切な UI をレンダリングするために必要な情報をすべて取得できます。

実装

$as によるオブジェクトタイプのピボット

useCodingTask フックは、$as 演算子を使用して、関連するオブジェクトタイプ間でピボットします。

Copied!
1 const codingTask: osdkCodingTask.OsdkInstance = task.osdkTask.$as(osdkCodingTask);

このパターンは、TypeScript の型システムを活用して、関連するオブジェクトタイプ間で安全に移行します。

  1. 基本となるタスクオブジェクト(task.osdkTask)は、ポリモーフィックな構造を持ちます
  2. $as 演算子は実行時チェックを行い、互換性を検証します
  3. 結果として、コーディングタスク固有のプロパティにアクセスできる、完全に型付けされたインスタンスが生成されます

このアプローチは、基本オブジェクトが特化したサブタイプを持つことができるポリモーフィックなデータモデルに不可欠です。

useCallback によるメモ化

このフックは、React の useCallback を使用してパフォーマンスを最適化します。

Copied!
1 2 3 4 5 6 7 const fetcher = useCallback(async () => { // フェッチャーのロジック }, [task]); const getObjectTypeMetadata = useCallback(async () => { // メタデータ取得のロジック }, [client]);

このパターンは、次の処理を行います。

  • レンダリングのたびに関数参照が不要に再作成されることを防ぎます
  • 依存関係が変わった場合にのみ関数を再構築します
  • 不要なエフェクトの実行と API 呼び出しを減らします
  • メモ化されたコンポーネントで使用するためにフックを最適化します

外部パッケージ

次の外部パッケージを useCodingTask フックとともに使用できます。

@osdk/client および @osdk/react

目的: バックエンドのデータサービスとやり取りするためのオントロジー SDK クライアント 利点:

  • データモデル用の型安全なインターフェースを提供します
  • 構造化されたデータクエリとメタデータへのアクセスを可能にします
  • クライアントインスタンスにアクセスするための useOsdkClient などのフックを公開します
  • 動的な UI レンダリングのためのメタデータ取得をサポートします

@advanced-to-do-application/sdk

目的: 事前定義されたデータ型を持つ、アプリケーション固有の SDK 利点:

  • コーディングタスク固有のデータモデル(osdkCodingTask)を含みます
  • コーディングタスクのプロパティに型付きでアクセスできます
  • 関連するオブジェクトタイプ間で型安全にピボットできます
  • アプリケーションで使用するオブジェクト継承モデルをサポートします

@osdk/foundry.admin

目的: ユーザーデータ型用の Foundry Admin SDK

利点:

  • createdBy フィールドと assignedTo フィールドで使用する User 型を提供します
  • ユーザーデータが Foundry Admin API と一貫した型で扱われることを保証します

useSWR

目的: データ取得、キャッシュ、状態管理 利点:

  • コーディングタスクのデータを取得してキャッシュするための洗練された方法を提供します
  • 読み込み中の状態とエラー状態を自動的に処理します
  • 組み込みの再検証戦略を提供します
  • 条件付き取得によってデータアクセスを簡素化します
  • インテリジェントなキャッシュによって冗長な API 呼び出しを減らします

使用例

Copied!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 import useCodingTask from '../dataServices/useCodingTask'; import type { ITask } from '../dataServices/useTasks'; function CodingTaskDetails({ task }: { task: ITask }) { const { codingTask, isLoading, isError, metadata } = useCodingTask(task); if (isLoading) return <div>Loading coding task details...</div>; if (isError) return <div>Error loading coding task: {isError.message}</div>; if (!codingTask) return <div>No coding task found</div>; return ( <div className="coding-task-details"> <h2>{codingTask.osdkCodingTask.title}</h2> <div className="metadata-section"> <h3>Task Metadata</h3> <div>Object Type: {metadata?.displayName || "Coding Task"}</div> </div> <div className="code-section"> <h3>Code Requirements</h3> <div className="language-badge">{codingTask.osdkCodingTask.language}</div> <pre> <code>{codingTask.osdkCodingTask.codeSnippet}</code> </pre> </div> <div className="people-section"> <h3>People</h3> <div className="assigned-to"> <span>Assigned to: </span> <span>{codingTask.assignedTo?.username ?? "Unassigned"}</span> </div> <div className="created-by"> <span>Created by: </span> <span>{codingTask.createdBy?.username ?? "Unknown"}</span> </div> </div> </div> ); }

エッジケースと制限事項

useCodingTask フックを使用する前に、次の状況と制限事項を考慮してください。

  • ユーザーデータがない場合: 親タスクにユーザーデータが含まれていなくても、フックは動作しますが、createdBy または assignedTo に対して undefined を返します。コンポーネントは、この状況を適切に処理する必要があります。
  • 無効な型のピボット: タスクオブジェクトをコーディングタスクにピボットできない場合(たとえば、実際には別のタスクタイプである場合)、$as 操作が実行時に失敗する可能性があります。このフックは現在、このエラーケースを明示的には処理しません。
  • メタデータの読み込み: メタデータはタスクデータとは別に読み込まれます。そのため、タスクデータは利用可能でも、メタデータはまだ読み込み中である短い期間が生じる可能性があります。コンポーネントは、この可能性を考慮する必要があります。
  • 親タスクへの依存関係:useCodingTask フックは、親タスクオブジェクトに完全に依存します。そのオブジェクトが不正な場合や、必要なデータがない場合、フックは期待される動作をしない可能性があります。
  • 変更処理のサポートなし: このフックはデータ取得機能を提供しますが、コーディングタスクを更新、作成、削除する関数は含まれていません。これらの操作には、別のフックまたは拡張機能が必要です。
  • 大規模データでのパフォーマンス: 非常に大きなコードスニペットや大量のメタデータを持つタスクでは、パフォーマンスに影響が出る可能性があります。このような場合は、仮想化またはページネーションの実装を検討してください。
  • ネットワークエラーの処理: このフックはエラーを公開しますが、失敗したリクエストを自動的に再試行しません。ネットワークが不安定な場合、アプリケーションで独自の再試行ロジックを実装する必要がある可能性があります。