ReactとTypeScriptを使用して顧客リスト管理アプリを構築する方法

著者は、Write for DOnationsプログラムの一部として寄付を受け取るためにTech Education Fundを選択しました。

前書き

TypeScriptは、JavaScript開発者がアプリ、特にWebアプリケーションのコードを構造化および作成する方法に多くの改善をもたらしました。 JavaScriptのスーパーセットとして定義されているTypeScriptは、JavaScriptと同じように動作しますが、開発者がバグの少ないまたはまったくないより大きく複雑なプログラムを構築できるように設計された追加機能を備えています。 TypeScriptの人気はますます高まっています。 Angular WebフレームワークのためにGoogleのような主要企業に採用されました。 Nest.jsバックエンドフレームワークもTypeScriptで構築されました。

開発者として生産性を向上させる方法の1つは、本番環境で既存のアプリを壊す心配をせずに、できるだけ早く新機能を実装できることです。 これを実現するために、静的に型指定されたコードを記述することは、多くのベテラン開発者が採用しているスタイルです。 TypeScriptのような静的に型付けされたプログラミング言語は、すべての変数とデータ型との関連付けを強制します。文字列、整数、ブール値など。 静的に型付けされたプログラミング言語を使用する主な利点の1つは、型チェックがコンパイル時に完了するため、開発者が非常に早い段階でコードのエラーを確認できることです。

ReactはオープンソースのJavaScriptライブラリであり、開発者はこれを使用して、スケーラブルなWebアプリケーション用のハイエンドユーザーインターフェイスを作成します。 単一ページアプリケーション向けにReactで構築された優れたパフォーマンスと動的なユーザーインターフェイスにより、開発者の間で人気があります。

このチュートリアルでは、別個のREST APIバックエンドと、ReactおよびTypeScriptで構築されたフロントエンドを備えた顧客リスト管理アプリケーションを作成します。 json-serverという名前の偽のR​​ESTAPIを使用してバックエンドを構築します。 これを使用して、CRUD(作成、読み取り、更新、削除)バックエンドをすばやくセットアップします。 したがって、ReactとTypeScriptを使用して、アプリケーションのフロントエンドロジックの処理に集中できます。

前提条件

このチュートリアルを完了するには、次のものが必要です。

  • Node.js(少なくともv6)およびnpm(少なくともv5.2)のローカルインストール。 Node.js is a JavaScript run-time environment that allows you to run your code outside of the browser. npmと呼ばれるパッケージマネージャーがプリインストールされており、パッケージをインストールおよび更新できます。 これらをmacOSまたはUbuntu18.04にインストールするには、How to Install Node.js and Create a Local Development Environment on macOSの手順またはHow To Install Node.js on Ubuntu 18.04の「PPAを使用したインストール」セクションに従います。

  • ヤーンのローカルインストール。 follow these stepsを使用して、オペレーティングシステムにYarnをインストールします。

  • TypeScriptとJavaScriptの基本的な理解。

  • インストールされているテキストエディタ。 Visual Studio CodeAtom、またはSublime Textなど。

[[step-1 -—- installing-typescript-and-creating-the-react-application]] ==ステップ1—TypeScriptのインストールとReactアプリケーションの作成

このステップでは、ノードパッケージマネージャー(npm)を使用して、TypeScriptパッケージをマシンにグローバルにインストールします。 その後、Reactとその依存関係もインストールし、開発サーバーを実行してReactアプリが動作していることを確認します。

開始するには、ターミナルを開き、次のコマンドを実行してTypeScriptをインストールします。

npm install -g typescript

インストールプロセスが完了したら、次のコマンドを実行して、TypeScriptのインストールを確認します。

tsc -v

マシンにインストールされている現在のバージョンが表示されます。

OutputVersion 3.4.5

次に、create-react-appツールを使用してReactアプリケーションをインストールし、1つのコマンドでアプリケーションをセットアップします。 npm 5.2以降に付属するパッケージランナーツールであるnpxコマンドを使用します。 create-react-appツールには、追加の構成を必要とせずにTypeScriptを操作するためのサポートが組み込まれています。 次のコマンドを実行して、typescript-react-appという名前の新しいReactアプリケーションを作成してインストールします。

npx create-react-app typescript-react-app --typescript

上記のコマンドは、typescript-react-appという名前の新しいReactアプリケーションを作成します。 --typescriptフラグは、Reactコンポーネントのデフォルトのファイルタイプを.tsxに設定します。

このセクションを完了する前に、アプリケーションはポート間を移動する必要があります。 これを行うには、React Routerという名前のReactアプリケーションのルーティングライブラリとそれに対応するTypeScript定義をインストールする必要があります。 yarnを使用して、このプロジェクトのライブラリとその他のパッケージをインストールします。 これは、特にReactアプリケーションの依存関係をインストールする場合に、yarnの方が高速であるためです。 新しく作成したプロジェクトフォルダーに移動し、次のコマンドでReact Routerをインストールします。

cd typescript-react-app
yarn add react-router-dom

これで、プロジェクト内でルーティング機能を提供するReact Routerパッケージができました。 次に、次のコマンドを実行して、React RouterのTypeScript定義をインストールします。

yarn add @types/react-router-dom

次に、ブラウザ用のPromisedベースのHTTPクライアントであるaxiosをインストールして、アプリケーション内で作成するさまざまなコンポーネントからHTTPリクエストを実行するプロセスを支援します。

yarn add axios

インストールプロセスが完了したら、次を使用して開発サーバーを起動します。

yarn start

アプリケーションはhttp://localhost:3000で実行されます。

React application homepage

アプリケーションのあるページから別のページへの移動を支援するために、TypeScriptのインストール、新しいReactアプリケーションの作成、React Routerのインストールが正常に完了しました。 次のセクションでは、アプリケーションのバックエンドサーバーを設定します。

[[step-2 -—- creating-a-json-server]] ==ステップ2—JSONサーバーの作成

このステップでは、Reactアプリケーションがすばやく接続できる模擬サーバーを作成し、そのリソースを使用します。 このバックエンドサービスは、運用環境のアプリケーションには適していないことに注意することが重要です。 Nest.js、Express、またはその他のバックエンドテクノロジーを使用して、実稼働環境でRESTful APIを構築できます。 json-serverは、プロトタイプを作成してバックエンドサーバーをモックする必要がある場合に便利なツールです。

npmまたはyarnのいずれかを使用して、マシンにjson-serverをインストールできます。 これにより、プロジェクトを使用する必要がある場合に、プロジェクトの任意のディレクトリから使用できるようになります。 新しいターミナルウィンドウを開き、次のコマンドを実行して、プロジェクトディレクトリ内にいる間にjson-serverをインストールします。

yarn global add json-server

次に、REST APIによって公開されるデータを含むJSONファイルを作成します。 このファイル(作成するファイル)で指定されたオブジェクトに対して、CRUDエンドポイントが自動的に生成されます。 まず、serverという名前の新しいフォルダーを作成し、そのフォルダーに移動します。

mkdir server
cd server

ここで、nanoを使用して、db.jsonという名前の新しいファイルを作成して開きます。

nano db.json

次のコンテンツをファイルに追加します。

/server/db.json

{
    "customers": [
        {
            "id": 1,
            "first_name": "Customer_1",
            "last_name": "Customer_11",
            "email": "[email protected]",
            "phone": "00000000000",
            "address": "Customer_1 Address",
            "description": "Customer_1 description"
        },
        {
            "id": 2,
            "first_name": "Customer_2",
            "last_name": "Customer_2",
            "email": "[email protected]",
            "phone": "00000000000",
            "address": "Customer_2 Adress",
            "description": "Customer_2 Description"
        }
    ]
}

JSON構造は、2つのデータセットが割り当てられた顧客オブジェクトで構成されます。 各顧客は、iddescriptionfirst_namelast_nameemailphone、およびaddressの7つのプロパティで構成されています。

ファイルを保存して終了します。

デフォルトでは、json-serverはポート3000で実行されます。これは、Reactアプリケーションが実行されるのと同じポートです。 競合を回避するために、json-serverのデフォルトポートを変更できます。 これを行うには、アプリケーションのルートディレクトリに移動します。

cd ~/typescript-react-app

お好みのテキストエディタでアプリケーションを開き、json-server.jsonという名前の新しいファイルを作成します。

nano json-server.json

次に、次を挿入してポート番号を更新します。

/json-server.json

{
    "port": 5000
}

これはjson-serverの構成ファイルとして機能し、サーバーが常に指定されたポートで実行されるようにします。

ファイルを保存して終了します。

サーバーを実行するには、次のコマンドを使用します。

json-server --watch server/db.json

これにより、ポート5000json-serverが開始されます。 ブラウザでhttp://localhost:5000/customersに移動すると、サーバーに顧客リストが表示されます。

Customer list shown by json-server

json-serverを実行するプロセスを合理化するために、次に示すように、serverという名前の新しいプロパティでscriptsオブジェクトにpackage.jsonを更新できます。

/package.json

{
...
  "scripts": {
    "start": "react-scripts start",
    "build": "react-scripts build",
    "test": "react-scripts test",
    "eject": "react-scripts eject",
    "server": "json-server --watch server/db.json"
  },
...
}

ファイルを保存して終了します。

これで、json-serverを開始したいときはいつでも、ターミナルからyarn serverを実行するだけです。

このアプリケーションのバックエンドサーバーとして使用する簡単なREST APIを作成しました。 また、REST APIのデフォルトデータとして使用される顧客JSONオブジェクトも作成しました。 最後に、json-serverを使用するバックエンドサーバーの代替ポートを構成しました。 次に、アプリケーションの再利用可能なコンポーネントを構築します。

[[step-3 -—- creating-reusable-components]] ==ステップ3—再利用可能なコンポーネントの作成

このセクションでは、アプリケーションに必要なReactコンポーネントを作成します。 これには、データベース内の特定の顧客の詳細をそれぞれ作成、表示、編集するコンポーネントが含まれます。 また、アプリケーション用のTypeScriptインターフェイスの一部を構築します。

開始するには、Reactアプリケーションを実行しているターミナルに戻り、CTRL + Cで開発サーバーを停止します。 次に、./src/フォルダーに移動します。

cd ./src/

次に、その中にcomponentsという名前の新しいフォルダーを作成し、新しいフォルダーに移動します。

mkdir components
cd components

新しく作成したフォルダー内に、customerフォルダーを作成し、そのフォルダーに移動します。

mkdir customer
cd customer

次に、Create.tsxおよびEdit.tsxという名前の2つの新しいファイルを作成します。

touch Create.tsx Edit.tsx

これらのファイルは、フォームをレンダリングし、それぞれ顧客の詳細を作成および編集するためのすべてのビジネスロジックを保持するReactの再利用可能なコンポーネントです。

テキストエディタでCreate.tsxファイルを開き、次のコードを追加します。

/src/components/customer/Create.tsx

import * as React from 'react';
import axios from 'axios';
import { RouteComponentProps, withRouter } from 'react-router-dom';

export interface IValues {
    first_name: string,
    last_name: string,
    email: string,
    phone: string,
    address: string,
    description: string,
}
export interface IFormState {
    [key: string]: any;
    values: IValues[];
    submitSuccess: boolean;
    loading: boolean;
}

ここでは、Reactaxios、およびReactRouterパッケージからのルーティングに必要なその他の必要なコンポーネントをインポートしました。 その後、IValuesIFormStateという名前の2つの新しいインターフェイスを作成しました。 TypeScript interfacesは、オブジェクトに渡す必要のある特定のタイプの値を定義し、アプリケーション全体で一貫性を保つのに役立ちます。 これにより、プログラムにバグが発生する可能性が低くなります。

次に、React.Componentを拡張するCreateコンポーネントを作成します。 IFormStateインターフェイスの直後のCreate.tsxファイルに次のコードを追加します。

/src/components/customer/Create.tsx

...
class Create extends React.Component {
    constructor(props: RouteComponentProps) {
        super(props);
        this.state = {
            first_name: '',
            last_name: '',
            email: '',
            phone: '',
            address: '',
            description: '',
            values: [],
            loading: false,
            submitSuccess: false,
        }
    }
}
export default withRouter(Create)

ここで、TypescriptでReactコンポーネントを定義しました。 この場合、CreateクラスコンポーネントはタイプRouteComponentPropsprops(「プロパティ」の略)を受け入れ、タイプIFormStateの状態を使用します。 次に、コンストラクター内で、stateオブジェクトを初期化し、顧客のレンダリング値を表すすべての変数を定義しました。

次に、コンストラクターの直後のCreateクラスコンポーネント内にこれらのメソッドを追加します。 これらのメソッドを使用して、顧客フォームを処理し、入力フィールドのすべての変更を処理します。

/src/components/customer/Create.tsx

...
          values: [],
          loading: false,
          submitSuccess: false,
      }
  }

  private processFormSubmission = (e: React.FormEvent): void => {
          e.preventDefault();
          this.setState({ loading: true });
          const formData = {
              first_name: this.state.first_name,
              last_name: this.state.last_name,
              email: this.state.email,
              phone: this.state.phone,
              address: this.state.address,
              description: this.state.description,
          }
          this.setState({ submitSuccess: true, values: [...this.state.values, formData], loading: false });
          axios.post(`http://localhost:5000/customers`, formData).then(data => [
              setTimeout(() => {
                  this.props.history.push('/');
              }, 1500)
          ]);
      }

      private handleInputChanges = (e: React.FormEvent) => {
          e.preventDefault();
          this.setState({
              [e.currentTarget.name]: e.currentTarget.value,
      })
  }

...
export default withRouter(Create)
...

processFormSubmission()メソッドは、アプリケーションの状態から顧客の詳細を受け取り、axiosを使用してデータベースに投稿します。 handleInputChanges()React.FormEventを使用してすべての入力フィールドの値を取得し、this.setState()を呼び出してアプリケーションの状態を更新します。

次に、handleInputchanges()メソッドの直後のCreateクラスコンポーネント内にrender()メソッドを追加します。 このrender()メソッドは、アプリケーションで新しい顧客を作成するためのフォームを表示します。

/src/components/customer/Create.tsx

...
  public render() {
      const { submitSuccess, loading } = this.state;
      return (
          

Create Post

{!submitSuccess && (
Fill the form below to create a new post
)} {submitSuccess && (
The form was successfully submitted!
)}
this.handleInputChanges(e)} name="first_name" className="form-control" placeholder="Enter customer's first name" />
this.handleInputChanges(e)} name="last_name" className="form-control" placeholder="Enter customer's last name" />
this.handleInputChanges(e)} name="email" className="form-control" placeholder="Enter customer's email address" />
this.handleInputChanges(e)} name="phone" className="form-control" placeholder="Enter customer's phone number" />
this.handleInputChanges(e)} name="address" className="form-control" placeholder="Enter customer's address" />
this.handleInputChanges(e)} name="description" className="form-control" placeholder="Enter Description" />
{loading && }
) } ...

ここでは、first_namelast_nameemailphoneaddress、およびdescriptionの値を保持する入力フィールドを持つフォームを作成しました。 )顧客の。 各入力フィールドには、キーストロークごとに実行されるメソッドhandleInputChanges()があり、Reactstateを入力フィールドから取得した値で更新します。 さらに、アプリケーションの状態に応じて、submitSuccessという名前のブール変数が、新しい顧客の作成の前後にアプリケーションが表示するメッセージを制御します。

このGitHub repositoryで、このファイルの完全なコードを確認できます。

Create.tsxを保存して終了します。

アプリケーションのCreateコンポーネントファイルに適切なロジックを追加したので、次にEditコンポーネントファイルのコンテンツを追加します。

customerフォルダー内のEdit.tsxファイルを開き、次のコンテンツを追加してReactaxiosをインポートし、TypeScriptインターフェイスを定義することから始めます。

/src/components/customer/Edit.tsx

import * as React from 'react';
import { RouteComponentProps, withRouter } from 'react-router-dom';
import axios from 'axios';

export interface IValues {
    [key: string]: any;
}
export interface IFormState {
    id: number,
    customer: any;
    values: IValues[];
    submitSuccess: boolean;
    loading: boolean;
}

Createコンポーネントと同様に、必要なモジュールをインポートし、それぞれIValuesおよびIFormStateインターフェースを作成します。 IValuesインターフェースは、入力フィールドの値のデータ型を定義しますが、IFormStateを使用して、アプリケーションの状態オブジェクトの予想される型を宣言します。

次に、次に示すように、IFormStateインターフェイスブロックの直後にEditCustomerクラスコンポーネントを作成します。

/src/components/customer/Edit.tsx

...
class EditCustomer extends React.Component, IFormState> {
    constructor(props: RouteComponentProps) {
        super(props);
        this.state = {
            id: this.props.match.params.id,
            customer: {},
            values: [],
            loading: false,
            submitSuccess: false,
        }
    }
}
export default withRouter(EditCustomer)

このコンポーネントは、RouteComponentProps<any>IFormStateのインターフェースをパラメーターとして受け取ります。 React Routerがパスパラメーターを解析するときはいつでも、データのタイプがnumberであるか%(( t5)s。 顧客のuniqueIdのパラメータを期待しているので、anyを使用する方が安全です。

コンポーネント内に次のメソッドを追加します。

/src/components/customer/Edit.tsx

...
    public componentDidMount(): void {
        axios.get(`http://localhost:5000/customers/${this.state.id}`).then(data => {
            this.setState({ customer: data.data });
        })
    }

    private processFormSubmission = async (e: React.FormEvent): Promise => {
        e.preventDefault();
        this.setState({ loading: true });
        axios.patch(`http://localhost:5000/customers/${this.state.id}`, this.state.values).then(data => {
            this.setState({ submitSuccess: true, loading: false })
            setTimeout(() => {
                this.props.history.push('/');
            }, 1500)
        })
    }

    private setValues = (values: IValues) => {
        this.setState({ values: { ...this.state.values, ...values } });
    }
    private handleInputChanges = (e: React.FormEvent) => {
        e.preventDefault();
        this.setValues({ [e.currentTarget.id]: e.currentTarget.value })
    }
...
}

export default withRouter(EditCustomer)

最初に、componentDidMount()メソッドを追加します。これは、コンポーネントの作成時に呼び出されるライフサイクルメソッドです。 このメソッドは、routeパラメーターから取得したidを取得して特定の顧客をパラメーターとして識別し、それを使用してデータベースから詳細を取得し、フォームに入力します。 さらに、フォームの送信を処理するメソッドを追加し、入力フィールドの値に加えられた変更を処理します。

最後に、Editコンポーネントにrender()メソッドを追加します。

/src/components/customer/Edit.tsx

...
    public render() {
        const { submitSuccess, loading } = this.state;
        return (
            
{this.state.customer &&
< h1 > Customer List Management App

Built with React.js and TypeScript

Edit Customer

{submitSuccess && (
Customer's details has been edited successfully
)}
this.handleInputChanges(e)} name="first_name" className="form-control" placeholder="Enter customer's first name" />
this.handleInputChanges(e)} name="last_name" className="form-control" placeholder="Enter customer's last name" />
this.handleInputChanges(e)} name="email" className="form-control" placeholder="Enter customer's email address" />
this.handleInputChanges(e)} name="phone" className="form-control" placeholder="Enter customer's phone number" />
this.handleInputChanges(e)} name="address" className="form-control" placeholder="Enter customer's address" />
this.handleInputChanges(e)} name="description" className="form-control" placeholder="Enter Description" />
{loading && }
}
) } ...

ここでは、特定の顧客の詳細を編集するフォームを作成し、そのフォーム内の入力フィールドに、アプリケーションの状態が取得した顧客の詳細を入力しました。 Createコンポーネントと同様に、すべての入力フィールドに加えられた変更は、handleInputChanges()メソッドによって処理されます。

このGitHub repositoryで、このファイルの完全なコードを確認できます。

Edit.tsxを保存して終了します。

アプリケーション内で作成された顧客の完全なリストを表示するには、./src/componentsフォルダー内に新しいコンポーネントを作成し、Home.tsxという名前を付けます。

cd ./src/components
nano Home.tsx

次のコンテンツを追加します。

/src/components/Home.tsx

import * as React from 'react';
import { Link, RouteComponentProps } from 'react-router-dom';
import axios from 'axios';

interface IState {
    customers: any[];
}

export default class Home extends React.Component {
    constructor(props: RouteComponentProps) {
        super(props);
        this.state = { customers: [] }
    }
    public componentDidMount(): void {
        axios.get(`http://localhost:5000/customers`).then(data => {
            this.setState({ customers: data.data })
        })
    }
    public deleteCustomer(id: number) {
        axios.delete(`http://localhost:5000/customers/${id}`).then(data => {
            const index = this.state.customers.findIndex(customer => customer.id === id);
            this.state.customers.splice(index, 1);
            this.props.history.push('/');
        })
    }
}

ここでは、Reactaxios、およびその他の必要なコンポーネントをReactRouterからインポートしました。 Homeコンポーネント内に2つの新しいメソッドを作成しました。

  • componentDidMount():アプリケーションは、コンポーネントがマウントされた直後にこのメソッドを呼び出します。 ここでの責任は、顧客のリストを取得し、それでホームページを更新することです。

  • deleteCustomer():このメソッドは、パラメーターとしてidを受け入れ、そのidで識別される顧客の詳細をデータベースから削除します。

次に、render()メソッドを追加して、Homeコンポーネントの顧客のリストを保持するテーブルを表示します。

/src/components/Home.tsx

...
public render() {
        const customers = this.state.customers;
        return (
            
{customers.length === 0 && (

No customer found at the moment

)}
{customers && customers.map(customer => )}
Firstname Lastname Email Phone Address Description Actions
{customer.first_name} {customer.last_name} {customer.email} {customer.phone} {customer.address} {customer.description}
Edit Customer
) } ...

このコードブロックでは、アプリケーションの状態から顧客のリストを配列として取得し、それを反復処理して、HTMLテーブル内に表示します。 また、customer.idパラメータを追加します。このパラメータを使用して、特定の顧客の詳細を識別し、リストから削除します。

Home.tsxを保存して終了します。

インターフェースを使用してコンポーネントとプロップのタイプを定義することにより、このアプリケーションで作成されたすべてのコンポーネントに対して静的に型付けされた原則を採用しました。 これは、ReactアプリケーションでTypeScriptを使用するための最良のアプローチの1つです。

これで、アプリケーションに必要なすべての再利用可能なコンポーネントの作成が完了しました。 これで、これまでに作成したすべてのコンポーネントへのリンクでアプリコンポーネントを更新できます。

[[step-4 -—- setting-up-routing-and-updating-the-entry-point-of-the-application]] ==ステップ4—ルーティングの設定とアプリケーションのエントリポイントの更新

このステップでは、React Routerパッケージから必要なコンポーネントをインポートし、ロードされるルートに応じて異なるコンポーネントをレンダリングするようにAppコンポーネントを構成します。 これにより、アプリケーションのさまざまなページをナビゲートできます。 ユーザーがルート(/createなど)にアクセスすると、React Routerは指定されたパスを使用して、そのようなルートを処理するために定義された適切なコンポーネント内のコンテンツとロジックをレンダリングします。

./src/App.tsxに移動します。

nano App.tsx

次に、そのコンテンツを次のものに置き換えます。

/src/App.tsx

import * as React from 'react';
import './App.css';
import { Switch, Route, withRouter, RouteComponentProps, Link } from 'react-router-dom';
import Home from './components/Home';
import Create from './components/customer/Create';
import EditCustomer from './components/customer/Edit';

class App extends React.Component> {
  public render() {
    return (
      
); } } export default withRouter(App);

React Routerパッケージから必要なすべてのコンポーネントをインポートし、顧客の詳細を作成、編集、表示するための再利用可能なコンポーネントもインポートしました。

App.tsxを保存して終了します。

./src/index.tsxファイルは、このアプリケーションのエントリポイントであり、アプリケーションをレンダリングします。 このファイルを開き、React Routerをインポートしてから、AppコンポーネントをBrowserRouter内にラップします。

/src/index.tsx

import React from 'react';
import ReactDOM from 'react-dom';
import './index.css';
import App from './App';
import { BrowserRouter } from 'react-router-dom';
import * as serviceWorker from './serviceWorker';
ReactDOM.render(
    
        
    
    , document.getElementById('root')
);
serviceWorker.unregister();

React Routerは、BrowserRouterコンポーネントを使用して、履歴や現在のパスなどのナビゲーションをアプリケーションに認識させます。

Index.tsxの編集が終了したら、保存して終了します。

最後に、Bootstrapを使用して、アプリケーションにスタイルを追加します。 Bootstrapは、レスポンシブなモバイルファーストプロジェクトをWeb上で開発するための一般的なHTML、CSS、およびJavaScriptフレームワークです。 開発者は、CSSを大量に記述することなく、魅力的なユーザーインターフェイスを構築できます。 レスポンシブグリッドシステムが付属しており、すべてのデバイスで機能するWebページを完成した外観にします。

アプリケーションにブートストラップとスタイリングを含めるには、./src/App.cssの内容を次のように置き換えます。

/src/App.css

@import 'https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css';

.form-wrapper {
  width: 500px;
  margin: 0 auto;
}
.App {
  text-align: center;
  margin-top: 30px;
}
nav {
  width: 300px;
  margin: 0 auto;
  background: #282c34;
  height: 70px;
  line-height: 70px;
}
nav ul li {
  display: inline;
  list-style-type: none;
  text-align: center;
  padding: 30px;
}
nav ul li a {
  margin: 50px 0;
  font-weight: bold;
  color: white;
  text-decoration: none;
}
nav ul li a:hover {
  color: white;
  text-decoration: none;
}
table {
  margin-top: 50px;
}
.App-link {
  color: #61dafb;
}
@keyframes App-logo-spin {
  from {
    transform: rotate(0deg);
  }
  to {
    transform: rotate(360deg);
  }
}

ここでBootstrapを使用して、デフォルトのレイアウト、スタイル、色を指定することにより、アプリケーションのルックアンドフィールを向上させました。 また、特にナビゲーションバーにいくつかのカスタムスタイルを追加しました。

App.cssを保存して終了します。

このセクションでは、ユーザーがアクセスしたルートに応じて適切なコンポーネントを表示するようにReact Routerを構成し、ユーザーにとってアプリケーションをより魅力的にするためのスタイリングを追加しました。 次に、アプリケーションに実装されているすべての機能をテストします。

[[step-5 -—- running-your-application]] ==ステップ5—アプリケーションの実行

いくつかの再利用可能なコンポーネントを作成して、ReactとTypeScriptを使用してこのアプリケーションのフロントエンドをセットアップし、json-serverを使用してREST APIを構築したので、アプリを実行できます。

プロジェクトのルートフォルダーに戻ります。

cd ~/typescript-react-app

次に、次のコマンドを実行してアプリを起動します。

yarn start

[.note]#Note:サーバーが他のターミナルウィンドウでまだ実行されていることを確認します。 それ以外の場合は、次のように開始します:yarn server

http://localhost:3000に移動して、ブラウザーからアプリケーションを表示します。 次に、Createボタンをクリックして、顧客の詳細を入力します。

Create customer page

入力フィールドに適切な値を入力した後、Create Customerボタンをクリックしてフォームを送信します。 新しい顧客の作成が完了すると、アプリケーションによってホームページにリダイレクトされます。

View customers page

いずれかの行のEdit Customerボタンをクリックすると、その行の対応する顧客の編集機能をホストするページに移動します。

Edit customer page

顧客の詳細を編集し、Edit Customerをクリックして顧客の詳細を更新します。

アプリケーションを実行して、すべてのコンポーネントが機能していることを確認しました。 アプリケーションのさまざまなページを使用して、顧客エントリを作成および編集しました。

結論

このチュートリアルでは、ReactTypeScriptを使用して顧客リスト管理アプリを作成しました。 このチュートリアルのプロセスは、Reactでアプリケーションを構築および構築する従来の方法としてJavaScriptを使用することとは異なります。 TypeScriptを使用する利点を活用して、このフロントエンドに焦点を当てたチュートリアルを完了しました。

このプロジェクトの開発を継続するには、モックバックエンドサーバーをExpressNest.jsなどの本番環境に対応したバックエンドテクノロジに移動します。 さらに、Passport.js認証ライブラリなどのさまざまなツールを使用して認証や承認などの機能を追加することにより、このチュートリアルで構築したものを拡張できます。

プロジェクトon GitHubの完全なソースコードを見つけることができます。