にむかひて

`def mount`の二度実行について

2022年3月 トップ > ひとこと > 調査したことの記録
#Elixir #Phoenix #LiveView

  • LiveViewを使ってるページでmountが二回走るときがある
  • ランダムでリソースを出しているページでは表示内容がすすっと切り替わる
    • def mountでリソースをランダムでロードしているようなページ
  • 二回走るのなんだろう、と気になってたけど実際に問題になるケースに直面した
  • さて、なんだろう?

結論

  • LiveViewのライフサイクル的に自然なこと
  • 初回とJavaScriptロード後の2回実行される
  • live_redirect 等で遷移したときはJSロード済みなので、1回しか実行されない
  • connected?(socket) で判定できる

なので、

  • ランダムに切り替わるようなケースでは、connected?のときのみにする
    • 他にいい方法があるような気もしつつ…
  • 負荷の大きいロードを行う場合はconnected?()のときのみにする(検討)
    • そこまで気にする必要はないかもしれない

また、

  • LiveViewなアプリケーション内での移動はlive_redirect to:にやはり統一する
    • 癖で link to:にしちゃっていないか
    • ただし、いずれにしてもユーザーでリロードされる可能性もあることも留意する
  • Phoenix.PubSub.subscribe なども connected?() 判定後に(一度だけ)実行する
  • / 例によって、公式にライフサイクルとして、きちんと書いてある

参考にさせていただいた資料

サイト内検索