RailsチュートリアルCh5 をAurelia2 で作り直す(コンポーネント作成)


やること

  • RailsチュートリアルのCh5 をAurelia2 で作成する

ToDo

  • Ch5 のワイヤーフレームから作成するコンポーネントを分割する

  • 各コンポーネントを作成する

ワイヤーフレームをコンポーネントに分割する

共通部分であるヘッダーとフッターとその他のページとに分ける。その上で下記のコンポーネントでアプリケーションを構成したい。

  • shared/header
  • shared/footer
  • pages/home
  • pages/help
  • pages/login
  • pages/about
  • pages/content
  • pages/news

makesコマンドで作成したsrcディレクトリ内にsharedディレクトリを作成し、さらにその中にheaderディレクトリ、footerディレクトリを作成する。同様にpagesディレクトリとその中に各ページ用のディレクトリを作成する。

コンポーネントの作成

各コンポーネントはそれぞれ個別の役割を負うものとする。例えばヘッダーコンポーネントであれば、ヘッダーナビゲーションをユーザーに提供する、等。

コンポーネント作成の基本

コンポーネントは、view-model を提供するためのJavaScript(TypeScript)のクラスとレンダリング対象となるHTMLで構成される。
具体的には、jsまたはtsファイルとhtmlファイルのセットが最小構成になる。例えば、home-pageを作成する場合、

home-page.ts
home-page.html

となる。これに追加で各コンポーネント用のcssファイルも追加する。この際、ファイル名がコンポーネントの名称となる。名称には必ず“-”を使用して命名する必要がある。また、tsファイルとhtmlファイルの名称は拡張子を除いて同一である必要もある。

HomePageコンポーネントの実装


/*
HomePage コンポーネントで使用するモデル
*/
export class HomePage {
}
<div class="center jumbotron">
   <h1>Welcome to the Sample App</h1>

   <h2>
     This is the home page for the Ruby on Rails Tutorial sample application.
   </h2>
</div>

必要最低限の実装はおこなった。次は、アプリケーションのルートコンポーネントで新しく作成したHomePageコンポーネントを使用したい。

アプリケーションルートコンポーネントへのインポート

最初にアプリケーションを作成されるファイルにmain.tsがある。

import Aurelia from 'aurelia';
import { MyApp } from './my-app';

Aurelia
  .app(MyApp)
  .start();

Aurelia は上記のコードでインポートされているmy-app.ts ファイルのクラスMyAppをアプリケーションのルート、大元のコンポーネントとして構成している。先ほど作成したHomeコンポーネントもただファイルを作成しただけではアプリケーションに組み込まれていない。作成したコンポーネントをアプリケーションに組み込む方法はいくつかあるが、今回は使用するコンポーネントのhtmlファイルに直接インポートする方法で実装する。
(別章の実装時に今みているmain.tsファイルに登録する方法に変更する。)

my-appコンポーネントへのインポート

自動生成されたmy-app.htmlのコードをすべて削除して、下記のコードに書き換える。

<import from="./pages/home/home-page"></import>
<home-page></home-page>

コンポーネントを利用するためには、利用するコンポーネントのhtmlファイルにタグを追加し、importタグ内で使用したいコンポーネントを指定する。

import from="コンポーネントの存在する相対パス/コンポーネント名称"

コンポーネントの名称は先ほど作成したファイル名となる。続いて、使用するコンポーネントのタグを記載する。

アプリケーションをサーブする

最後にnpm startコマンドでアプリケーションをローカルで起動して、先ほど作成したhomeページの記載内容がレンダリングされているか確認する。

次にやること

  • 残りのコンポーネントを作成する
  • 複数のコンポーネントをルータによりルーティングする
  • Bootstrapによりデザインを調整する