vekvek

vekvek

I recently started exploring LiveView.
I can’t figure out how to pass custom named slots into <.live_component>.

Here is my code:

<.live_component
    id="modal"
    module={Modal}
  >
    <:header>
      <p>Welcome from header</p>
    </:header>

    <:content>
      <p>Welcome</p>
    </:content>
  </.live_component>

Modal component:

def render(assigns) do
  assigns =
    assigns
    |> assign_new(:header, fn -> [] end)
    |> assign_new(:content, fn -> [] end)

  ~H"""
    <div class="bg-red-500" id={@id}>
      <div class="border-b-2 border-gray-300 bg-blue-500">
        <%= render_block(@header) %>
      </div>
      <%= render_block(@content) %>
    </div>
  """
end

Error I got:

key :header not found in: %{__changed__: %{flash: true, id: true, inner_block: true}, flash: %{}, id: "modal-1", inner_block: #Function<8.90377761/2 in LiveviewPlaygroundWeb.TestLive.render/1>, myself: %Phoenix.LiveComponent.CID{cid: 1}, socket: #Phoenix.LiveView.Socket<id: "phx-F0LTuDdKH6Jl5wOC", endpoint: LiveviewPlaygroundWeb.Endpoint, view: LiveviewPlaygroundWeb.TestLive, parent_pid: nil, root_pid: nil, router: LiveviewPlaygroundWeb.Router, assigns: #Phoenix.LiveView.Socket.AssignsNotInSocket<>, transport_pid: nil, ...>}

Thanks!

Marked As Solved

fceruti

fceruti

[edit] False: LiveComponents don’t have slots, only components.

You’d need to so something like:

<.live_component
    id="modal"
    module={Modal}
  >
  <.page_component>
    <:header>
      <p>Welcome from header</p>
    </:header>

    <:content>
      <p>Welcome</p>
    </:content>
  </.page_component>
  </.live_component>

Also Liked

Eiji

Eiji

Are you sure?

Slots

LiveComponent can also receive slots, in the same way as a Phoenix.Component:

Source: Slot section in Phoenix.LiveComponent

I just tried it in example script:


defmodule MyTable do
  use Phoenix.LiveComponent

  def render(assigns) do
    ~H"""
    <table>
      <tr>
        <%= for col <- @col do %>
          <th><%= col.label %></th>
        <% end %>
      </tr>
      <%= for row <- @rows do %>
        <tr>
          <%= for col <- @col do %>
            <td><%= render_slot(col, row) %></td>
          <% end %>
        </tr>
      <% end %>
    </table>
    """
  end
end

defmodule SamplePhoenix.SampleLive do
  use Phoenix.LiveView

  # …

  def mount(_params, _session, socket) do
    users = [
      %{address: "john.doe@example.com", name: "John Doe"},
      %{address: "sample@example.com", name: "Sample"}
    ]

    {:ok, assign(socket, :users, users)}
  end

  # …

  def render(assigns) do
    ~H"""
    <.live_component id="my-table" module={MyTable} rows={@users}>
      <:col :let={user} label="Name">
        <%= user.name %>
      </:col>

      <:col :let={user} label="Address">
        <%= user.address %>
      </:col>
    </.live_component>
    """
  end
end

Last Post!

garrison

garrison

The docs are quite terse but they imply that you have to make sure to pass the assign along in update/2 if you’re not doing that.

def update(assigns, socket) do
  socket = assign(socket, :col, assigns.col)
  # or socket = assign(socket, assigns) if you want to keep them all
  {:ok, socket}
end

I’m not actually sure if you can use the slot macro for a LiveComponent, though I don’t think it’s actually required? Did you try it?

Where Next? Top

Trending in Questions Top

RSP87
I’m working on a project that simulates the bumbl example in the programming phoenix book. It acts almost like an email client. We have a...
New
kpanic
Hi everyone, I am toying with the idea of building a “match maker” for giving personal help to people that wants to start coding. I sta...
New
nseaSeb
Hello, I know there is an approach for handling lists that allows for optimized traversal, but I can’t recall the specific method (somet...
New
brecabral
Documentation While reading the Scoped Routes section, I noticed that the documentation currently refers to a problem without explainin...
New
velrest
So my question is quite simple and i have found no conclusive answer on forum, google or AI. Should we use :erlang.float for Integer to ...
New
asweet-confluent
I recently noticed that Elixir’s Logger defaults its primary log level to :debug when no :logger, :level application configuration is pre...
New
apz
I’m new to elixir and just tried to install the elixirLS extension for VScode(ium) and it is throwing some errors that I would like help ...
New

Other Trending Topics Top

GenericJam
Edit: 2026 May 15 - This post is archived. Mob is alive!! Main docs: mob v0.7.11 — Documentation A bit of explanation for the slightly c...
New
JesseHerrick
Hey, I’m Jesse and I’m the main contributor behind Dexter, a full-featured, lightning-fast Elixir LSP optimized for large codebases. It s...
New
mudasobwa
I am happy to introduce the very α version of the new programming language compiled to BEAM. Welcome Cure. It has literally three kille...
New
marciok
Hi there! We created Gust: A task orchestrator inspired by Airflow. For those who have never heard about Aiflow, it’s a Python-based wor...
New
mhanberg
Hi everyone! The first release candidate for the Expert language server project is now available! We’ve published a press release detai...
New
jimsynz
Beam Bots (or just BB for short) is a framework for building fault-tolerant robotics applications in Elixir using familiar OTP patterns. ...
New

We're in Beta

About us Mission Statement

Options

Thread Display Mode




Thread Preview

Skip Thread Previews