Posted at

Elm SPA テンプレートを作った 2

前半: Elm SPA テンプレートを作った 1

elm-my-spa の解説を続けます。


全てのページで使用するデータの保持方法

例えばセッション情報。ログインユーザデータ、言語設定、 Ports から受け取った何らかのデータ。これらはどのページでも必要ですが、全体で共有すべきものです。どう保持したら良いでしょうか。

もう一度 Main の Model を見てみます。


Main.elm

type Model

= NotFound Env
| Index Env IndexPage.Model
| View Env Id ViewPage.Model

各ページを表現していて、どのページを表示するか判断するのに使用しています。こいつに Env というモデルを渡しています。これが共有データ保管場所として機能しています。


Env.elm

type Env

= Env Internals

type alias Internals =
{ key : Nav.Key
}

create : Nav.Key -> Env
create key =
Env (Internals key)

navKey : Env -> Nav.Key
navKey (Env internals) =
internals.key


共有データを増やしたい場合は、 Internals にいくらでも突っ込めば良いんです。

Main.elm 内を env で検索すると、 Model の初期化時、Model の変更(ページ切り替え)時に、各ページの init 関数に Env を渡し、常に引き回していることが分かるかと思います。


まとめ

以上で elm-my-spa の解説を終わります。

今後もうちょっと拡張して、何かしらの API を叩くことで Http くらいは加えようかと思います。