tcoopman
So I wanted to make sure to understand the different tradeoffs between LiveComponents and child LiveViews
If you have the need create a component that also needs state and handle events, you’ll need to reach for either a LiveComponent or a child LiveView.
The difference between them as far I as found out so far:
- A
LiveComponentruns in the parentLiveViewprocess, whereas a child will run in it’s own process. This means that a crash in theLiveComponentcrashes the parent. This is not the case for the child. - because a
LiveComponentis not a process, it does not havehandle_info. So if you need to interact withhandle_infoyou’ll need to handle that in the parent. - A child
LiveViewcan’t implementhandle_params. I’m not sure how the lifecycle of a childLiveViewworks exactly. - You can’t pass assigns to a child
LiveVieweasily. You can pass them via a session, or via sending messages I guess. - re-rendering of a child
LiveViewdoesn’t happen automatically when the parent re-renders, even if the session data changes, no re-render is triggered. - When using a
LiveComponentyou’ll always need to passphx-targetto target the correct component. This means you might need to pass on the@myselfto other components.
Can you fully encapsulate state/events in case you want to render it from multiple different parents?
I don’t think so, the parent always needs to know about handle_info in case of a LiveComponent.
And a child LiveView behaves completely differently regarding to passing assings and re-rendering.
Furthermore, when using LiveComponents you will need to pass on @myself down to all components that trigger any handle_event callbacks. Even if you nest your components only a little bit, this is a lot of passing this down.
When to choose a child LiveView over a LiveComponent?
I’m not sure I know good use cases.
Remarks?
Let me know where I’m wrong.
Trending in Questions
Other Trending Topics
Categories:
Sub Categories:
Forums
Popular Tags
- #ecto
- #liveview
- #troubleshooting
- #learning-elixir
- #library
- #deployment
- #erlang
- #testing
- #genserver
- #mix
- #absinthe
- #remote-other
- #otp
- #plug
- #how-to-question
- #macros
- #postgres
- #elixirconf
- #channels
- #exunit
- #discussion
- #code-sync
- #podcasts
- #javascript
- #onsite
- #dialyzer
- #docker
- #authentication
- #ai
- #umbrella
- #full-time-contract
- #podcasts-by-brainlid
- #ecto-query
- #blog-post
- #elixirconf-us
- #elixir-ls
- #phoenix_html
- #iex
- #graphql
- #genstage
- #websockets
- #supervisor
- #advent-of-code
- #distillery
- #processes
- #elixirconf-eu
- #api
- #forms
- #security
- #metaprogramming











Showing Posts 1 to 2- Show Best Posts
- Show All (oldest first)
- Show All (newest first)
cmo
You can encapsulate the events by defining a function in the component’s module to attach the event handlers with
attach_hook. That way you define it all once and just need to attach the hooks wherever the component is used.Never used a child liveview so nothing to add on that topic.
dustin
I’m enjoying your posts on this subject because I’ve started using child LiveViews and I’m running into the same types of issues.
I can think of two reasons to use a child LiveView over a Live Component:
I came to the forum just now because I lost a bunch of time trying to get my child LiveView to re-render when I changed the params I’m passing it. Perplexity said it would work.