Phoenix 现在的 HTML 心智,不该再停留在“模板文件替换变量”。
你应该把它理解成:
函数组件 + HEEx = 可组合的公告板工坊。
官方组件文档里有个很核心的定义:
- 任何接收
assigns并返回~H模板的函数,都可以看作函数组件
这意味着 Phoenix 的 HTML 不是“纯模板语法”,而是Elixir 函数世界和 HTML 世界正式接轨。
来看一个组件:
defmodule CityWeb.DispatchComponents do
use Phoenix.Component
attr :dispatch, :map, required: true
def dispatch_row(assigns) do
~H"""
<li id={"dispatch-#{@dispatch.id}"} class="dispatch-row">
<strong>{@dispatch.title}</strong>
<span>{@dispatch.status}</span>
</li>
"""
end
end使用时:
<ul>
<.dispatch_row :for={dispatch <- @dispatches} dispatch={dispatch} />
</ul>这套体系和 React 很像吗?有一点像。
但你脑子里不要直接把它等同成 React。
区别在于:
- Phoenix 组件首先是 服务器模板函数
- 它默认不是浏览器端状态组件
- 它最先解决的是 HTML 组织、复用、校验、差异追踪
所以组件在 Phoenix 里,更像“标准公告栏组件、表单组件、按钮组件、布局组件”,而不是默认就承载一整套浏览器端交互状态。