用途:该技能用于在 Phoenix LiveView 中处理大集合渲染,规则要求集合达到 100+ 条时使用 streams,并配合分页或无限滚动;较小列表仍用普通 assigns,且不应对无限量条目做流式渲染。
主要能力与规则:增量更新必须使用 stream_insert/3 与 stream_delete/3,不能替换整个 stream assign;模板容器需加 phx-update="stream",否则会整段重渲染;筛选和排序使用 reset: true 先清空再插入新结果集;stream_configure/3 必须在 stream/3 之前调用,否则自定义 dom_id 无效;排序或筛选需从数据库重新获取数据,因为 streams 不把条目保存在 assigns 中。
使用方式:在 mount/3 中定义 DOM ID 策略并调用 stream_configure 与 stream;模板中用 :for={{dom_id, post} <- @streams.posts} 配合 id={dom_id};事件中用 stream_insert/stream_delete 处理变更;PubSub 广播则在 handle_info 中更新流,订阅前判断 connected?(socket)。无限滚动用 assign(:page, 1) 与 load_more 事件逐页 stream_insert。
适用场景:大型列表、无限滚动、实时新增或删除、就地编辑、筛选与排序。
限制与调试:常见问题是漏加 phx-update="stream"、漏写 id={dom_id}、误替换整个流、DOM ID 冲突、未先 stream_configure、对小集合滥用 streams。可在 DevTools 的 Network → WS 检查是否为定向补丁而非整体替换。官方文档来源与版本兼容性等事实暂未提供。