In considering AI use cases and capabilities, I set Claude.ai on the task of describing the life cycle and events for PhoenixLiveView LiveComponent. The prompt, including my typo:
Draw a collection of sequence diagrams to explain event handling and callbacks for PhoenixLiveView LiveComponents work (documentation is https://hexdocs.pm/phoenix_live_view/Phoenix.LiveComponent.html#callbacks) written as mermaid code (reference documentation is https://mermaid.js.org/syntax/sequenceDiagram.html).
The high level output was:
I’ll create a collection of sequence diagrams that explain event handling and callbacks for Phoenix LiveView LiveComponents using Mermaid. These diagrams will help visualize the lifecycle and interactions of LiveComponents.
Phoenix LiveComponent Sequence DiagramsDiagram
Let me create a few more diagrams to cover different aspects of LiveComponent interactions:
LiveComponent Event HandlingDiagram
LiveComponent Message HandlingDiagram
LiveComponent Parent-Child CommunicationDiagram
Stateful LiveComponent LifecycleDiagram
These sequence diagrams illustrate the key interactions and lifecycle of Phoenix LiveComponents:
Initial Mount: Shows how a LiveComponent is initialized and rendered during the first page load.
Event Handling: Demonstrates how events are processed, differentiating between events targeted directly at the component versus those handled by the parent LiveView.
Message Handling: Illustrates how send_update works to trigger out-of-band updates to components.
Parent-Child Communication: Shows the two primary ways parent LiveViews communicate with child LiveComponents.
Stateful Component Lifecycle: Details how stateful LiveComponents maintain their state across multiple interactions.
Each diagram visualizes different aspects of the LiveComponent lifecycle, helping to clarify how these components interact with LiveViews and the browser. Would you like me to explain any specific aspect of these diagrams in more detail?
The diagrams are below. I’ve looked at them for a few minutes and compared them with the documentation. They seem correct, although I may have missed an error. If you find a mistake or something significantly missing, please let me know (dan-janowski).
These strike me as pretty well formed and useful diagrams. It would have taken me more than an hour, probably a few, to decide which diagrams to make and the contents. Writing this article has already taken significantly longer to write than Claude took to generate the diagrams. Though I did write updated mermaid and link generating plugins for Liquid to make this post.
LiveComponent Lifecycle - Initial Mount
sequenceDiagram
title LiveComponent Lifecycle - Initial Mount
Browser->>LiveView: Initial Request
LiveView->>LiveComponent: mount/1
Note over LiveComponent: Initialize state
LiveComponent->>LiveView: Return socket
LiveView->>LiveComponent: update/2
Note over LiveComponent: Process assigns
LiveComponent->>LiveView: Return updated socket
LiveView->>LiveComponent: render/1
Note over LiveComponent: Generate HTML
LiveComponent->>LiveView: Return rendered HTML
LiveView->>Browser: Send HTML response
LiveComponent Event Handling
sequenceDiagram
title LiveComponent Event Handling
Browser->>LiveView: User Event (phx-click, etc.)
Note over LiveView: Event contains phx-target
alt Event Targeted at LiveComponent
LiveView->>LiveComponent: handle_event/3
Note over LiveComponent: Process event
LiveComponent->>LiveComponent: Update internal state
LiveComponent->>LiveView: Return updated socket
LiveView->>LiveComponent: render/1
LiveComponent->>LiveView: Return rendered HTML
LiveView->>Browser: Send HTML diff
else Event Targeted at Parent LiveView
LiveView->>LiveView: handle_event/3
Note over LiveView: Process event
LiveView->>LiveView: Update state
LiveView->>LiveComponent: update/2 (if state affects component)
LiveComponent->>LiveView: Return updated socket
LiveView->>LiveComponent: render/1
LiveComponent->>LiveView: Return rendered HTML
LiveView->>Browser: Send HTML diff
end
LiveComponent Message Handling (send_update)
sequenceDiagram
title LiveComponent Message Handling (send_update)
participant Process as "External Process"
participant LVReg as "LiveView Registry"
participant LiveView
participant LiveComponent
Process->>LVReg: send_update(Component, id: id, ...)
LVReg->>LiveView: Find LiveView containing component
LiveView->>LiveComponent: update/2
Note over LiveComponent: Process updated assigns
LiveComponent->>LiveView: Return updated socket
LiveView->>LiveComponent: render/1
LiveComponent->>LiveView: Return rendered HTML
LiveView->>Browser: Send HTML diff
LiveComponent Parent-Child Communication
sequenceDiagram
title LiveComponent Parent-Child Communication
Browser->>LiveView: User Event
LiveView->>LiveView: handle_event/3
Note over LiveView: Update state
alt Using assign
LiveView->>LiveComponent: update/2 with new assigns
LiveComponent->>LiveView: Return updated socket
else Using send_update
LiveView->>LiveComponent: Phoenix.LiveView.send_update
Note over LiveComponent: Component receives out-of-band update
LiveComponent->>LiveView: Trigger re-render
end
LiveView->>LiveComponent: render/1
LiveComponent->>LiveView: Return rendered HTML
LiveView->>Browser: Send HTML diff
Stateful LiveComponent Lifecycle
sequenceDiagram
title Stateful LiveComponent Lifecycle
Browser->>LiveView: Initial Request
LiveView->>LiveComponent: mount/1
Note over LiveComponent: Initialize state in socket
LiveComponent->>LiveView: Return socket with state
Browser->>LiveView: User Event (phx-target=component)
LiveView->>LiveComponent: handle_event/3
Note over LiveComponent: Process event with socket state
LiveComponent->>LiveComponent: Update socket state
LiveComponent->>LiveView: Return updated socket
LiveView->>Browser: Send HTML diff
Note over LiveComponent: State persists between renders
Browser->>LiveView: Another User Event
LiveView->>LiveComponent: handle_event/3
Note over LiveComponent: Access previous state from socket
LiveComponent->>LiveView: Return updated socket
LiveView->>Browser: Send HTML diff