LiveView 有个非常好用的能力:live navigation。
官方文档把它分得很清楚:
patchnavigate
你可以这样记:
patch:还在同一个中控室,只是更新当前街区参数navigate:离开当前中控室,切到另一个中控室href/redirect:普通出城再进城,完整刷新
看例子:
<.link patch={~p"/live/dispatches?page=2"}>下一页</.link>
<.link navigate={~p"/live/reports"}>去报表中心</.link>
<.link href={~p"/dispatches"}>回普通页面</.link>服务端:
{:noreply, push_patch(socket, to: ~p"/live/dispatches?page=2")}
{:noreply, push_navigate(socket, to: ~p"/live/reports")}它们的区别不是“语法癖好”,而是生命周期真的不一样。
patch
= 同一 LiveView 内参数变化
= 调 handle_params/3
= 发最小差异
navigate
= 换到另一个 LiveView
= 保留 live session 内的壳子
= 不做整页刷新
href / redirect
= 走普通 HTTP
= 全页重载这使 Phoenix 的页面导航能非常细腻。
你不必在“全页刷新”和“整站 SPA”之间做二元选择。