最近複習到使用 LiveComponent 保存狀態的代價,試著重新咀嚼並翻譯紀錄在這。

儘管 Phoenix.LiveView 內部用來追蹤 stateful component 的機制相當輕量,但是為了追蹤和傳送 assigns 的差異,component 所有的 assigns 是存放在記憶體內的。

所以要避免一股腦地直接將所有 LiveView 的 assigns 直接倒給 LiveComponent。

# DON'T do this
<.live_component module={MyComponent} {assigns} />

# Instead pass only the keys that you need:
<.live_component module={MyComponent} user={@user} org={@org} />

好消息是,因為 LiveView 和 LiveComponent 處於同一個 process ,因此資料結構在記憶體中共享同樣的位置,以上面程式碼為例,view 和 component 共享同樣的 @user@org 這兩個 assigns。

另外要避免用 LiveComponent 卻只是單純地抽 DOM 畫面的元件來複用,其實這類型的任務交給 function component (Phoenix.Component) 來處理會更加合適:

def my_button(text, click) do
  assigns = %{text: text, click: click}

  ~H"""
  <button class="css-framework-class" phx-click={@click}>
    <%= @text %>
  </button>
  """
end

一個好的 LiveComponent 應當用來封裝應用程式的關注點,而非 DOM 的功能性操作。

參考

⤧  Previous post 如何設定 Git pre-commit hook 自動執行語法檢查 ⤧  Next post 為何家會傷人