- Iron Routerには以下の5つのフックが定義できるようになっている。
- onRun
- onRerun
- onBeforeAction
- onAfterAction
- onStop
その他に呼び出しのタイミングを考慮する上で、
- subscriptions
- waitOn
オプションがある。
ここまでで1つ覚えておくことは、onRun, onStop以外はリアクティブに再計算されるということ。
次に、呼び出される順序は、通常(waitOnで返すハンドルのready()が一旦はfalseを返すような場合)
- subscriptions #1
- waitOn #1
- onRun #1
- onAfterAction #1
- subscriptions #2
- waitOn #2
- onRerun #1
- onBeforeAction #1
- action(というよりpage rendering) #1
- onAfterAction #2
- onStop #1
これは解説が必要で、
- まずsubscriptions/waitOnがコールされる
- onRunがコールされる
- waitOnの戻り値のready()がfalseなら、onBeforeActionとactionが見送られて、onAfterActionがコールされる。
- Iron Router 1.0の仕様ではどうも、waitOnの戻り値のready()がtrueになるとリアクティブな再計算とみなされるようで、subscriptions/waitOnがコールされる(注1)
- 再計算とみなされているのでonRerunがコールされる
- onBeforeAction, action, onAfterActionの順にコールされる。
(注1) subscribeは重複してコールしても動作上無視するようなので問題なさそうだが、お手製のready()ハンドルを作るとここで色々困る。github レポジトリのイシューに上がっている。
で、各フックの使い方ですが、
- リアクティブでなくていいものはonRun
- subscriptions/waitOnに依存しないものはonAfterAction
- ページレンダリングの前に実行したいものはonBeforeAction
- ページレンダリングの後に実行したいものはonAfterActionでthis.ready()がtrueの時
onAfterActionの実装が名前のイメージと違ってしまっているおかげでonRerunは使い道がなさそうです。
このタイミング仕様はわかりにくいし使いにくいので近いうちに変わるような気がします。
ただ、Iron Router開発が活発とは言えなくなっていて…
Flow Routerにi18nパッケージができたらみんなそちらに乗り換えてしまうかもしれませんね。
がんばれ、Iron Router!