diff --git a/lib/phoenix_component.ex b/lib/phoenix_component.ex
index a8ea7e2267..9a2a2254ee 100644
--- a/lib/phoenix_component.ex
+++ b/lib/phoenix_component.ex
@@ -2815,16 +2815,40 @@ defmodule Phoenix.Component do
assigns = assign(assigns, :forms, forms)
~H"""
- <%= for finner <- @forms do %>
- <%= if !@skip_hidden do %>
- <%= for {name, value_or_values} <- finner.hidden,
- name = name_for_value_or_values(finner, name, value_or_values),
- value <- List.wrap(value_or_values) do %>
-
- <% end %>
- <% end %>
- {render_slot(@inner_block, finner)}
- <% end %>
+ <.inputs_for_form :for={form <- @forms} :key={form.id} form={form} skip_hidden={@skip_hidden}>
+ {render_slot(@inner_block, form)}
+
+ """
+ end
+
+ attr.(:skip_hidden, :boolean, required: true)
+ attr.(:form, Phoenix.HTML.Form, required: true)
+
+ slot.(:inner_block, required: true)
+
+ defp inputs_for_form(assigns) do
+ hidden_inputs =
+ if assigns.skip_hidden do
+ []
+ else
+ for {name, value_or_values} <- assigns.form.hidden,
+ name = name_for_value_or_values(assigns.form, name, value_or_values),
+ {value, index} <- value_or_values |> List.wrap() |> Enum.with_index() do
+ {name, value, index}
+ end
+ end
+
+ assigns = assign(assigns, :hidden_inputs, hidden_inputs)
+
+ ~H"""
+
+ {render_slot(@inner_block)}
"""
end