7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

[Liveview] LiveviewとLiveComponent間の状態管理

Last updated at Posted at 2021-10-14

LiveviewとLivecmponent間の状態管理の理解があやふやだったので、覚書として簡単にまとめました。

主にsocketのassignsを更新する方法についてです。

Liveview自身の状態更新

Liveview自身の状態の更新の場合はassign/2 or assign/3を使ってシンプルに更新できます。

  assign(socket, hoge: "new_hoge")

参考文献:

LiveComponentからLiveviewへの状態更新

LiveviewとLiveComponentは同じプロセス内にいるため、LiveComponent側からLiveview(つまりselfへ)メッセージを送信し、Liveview側でhandle_info/2を用いて受信することで状態を更新できます。

  # from LiveComponent
  send self(), {:msg, %{hoge: "new_hoge"}}

  # in the Liveview
  def handle_info({:msg, hoge}, socket) do
    {:noreply, assign(socket, hoge)}
  end

参考文献: 下記リンクのManaging Stateより

LiveviewからLiveComponentへの状態更新

LiveviewはLiveComponentの親であるため、send_update/3を用いてLiveComponentの状態更新ができます。

  send_update(Hoge, id: "hoge", hoge: "new_hoge")

参考文献:

LiveComponent自身の状態更新

Liveview自身の状態更新の時と基本的に同じ手順ですが、一点異なるのはテンプレートでphx-clickイベントを設定するときにphx-target={@myself}も一緒に書くという点です。
phx-target={@myself』を付けないとイベントがliveviewの方に送られてしまうので、LiveComponent自身にイベントが送られるようにするためです。

  # in the Heex templete
  <button phx-click="update_hoge" phx-target={@myself} >Update Hoge</button>

  # in the LiveComponent 
  def handle_event("update_hoge", ...

参考文献:下記リンクの Targeting Component Eventsより

7
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?