htmx

演示

十一件现场,件件真实运行。前七件是超文本的经典套路,后四件专演 v4 招牌新特性——每一个「演示台」都标注所用属性,看懂一处,看懂全局

点击计数

README 快速开始的完全体:hx-post 把计数交给服务器,响应就是下一次点击的按钮本身

hx-post · hx-swap="outerHTML"
服务器换回来的 HTML 里,按钮带着新计数、hx-post 原样保留——状态在服务器,界面即响应。计数只活在本站进程里,重启即归零,很 htmx。

自动补全

输入属性名,服务器返回候选列表:hx-get + keyup changed delay:400ms,一个搜索框的全部家当。

hx-get · hx-trigger="keyup changed delay:400ms" · hx-target
htmx 对空值输入默认不发起请求;候选列表由服务器按 q 现场过滤生成——htmx.org 官网文档搜索即此套路。

点击加载 · 局部刷新

点击「换一条摘录」,服务器从语录池随机取一条,只换 #sig-text 一处——页面纹丝不动,角落焕然一新

hx-get · hx-target="#sig-text" · hx-swap="innerHTML settle:600ms"
—— 尚未获取 ——
settle:600ms.htmx-settling 朱砂底驻留片刻——换入的动效就这么「点」出来。

无限瀑布

revealed 触发 + afterend 追加:每张卡片滚进视口,就顺手把下一张拉进来。

hx-get · hx-trigger="revealed" · hx-swap="afterend"
首张由 load 引入,此后每张自带 revealed 钩子——列表自己把下一张拽进来,无一行框架代码。

行内编辑

点条目变输入框(服务器换回表单),回车提交 hx-post(服务器换回静态文本)——经典 mustache 变奏,纸墨版:

hx-get → 表单 · hx-post → 文本(两次「就地变身」)
编辑态与非编辑态是服务器返回的两副 HTML 面孔blur 或 Enter 提交后,世界恢复平静。

服务器驱动弹窗

htmx 不弹「modal 组件」,弹的是一段 HTML。hx-on 收 htmx 事件、dialog 元素原生 showModal():

hx-get → 换入 dialog 内容 + 打开
hx-on::after:request 在响应换入后打开对话框——内容从服务器来,礼节由浏览器尽

全属性烟花

最后放一个「全家福」:hx-get 取一段随机 ASCII 烟花、click 触发、指示器转圈、swap 延迟退让、settle 补色、scroll 归位——一屏之内:

综合演示 · 一属性一职责

  
swap:200ms 先让上一发的余晖谢幕,再换入新的一发——这就是「延迟换入」的观感魔法。

v4 招牌新特性

前七件 v2 也能跑;下面四件,是 v4 从零重写后带来的新能力——响应式引擎、乐观 UI、状态分流、增量合并

响应式引擎 · hx-live

v4 新载的客户端响应式引擎:状态就近放在祖先的 data-*hx-on 改它、hx-live:text 绑它——一次点击都不惊动服务器

hx-live · 纯客户端响应式(零 HTTP 往返)
0 (偶数)
共享态 data-count 挂在共同祖先上,两个 {{}} 分别绑数值与奇偶——v4 心智:能用 HTML 用 HTML,CSS 能推导交给 CSS,都不够了才上 hx-live——仍然不写脚本文件。

乐观 UI · hx-pending

v4 内置的乐观占位:点下瞬间先把占位内容换进落点,真响应到了再覆盖——hx-pending 指向占位模板:

hx-post · hx-pending="#pend-tpl"
先给反馈、后补结果——v2 时代要手写一堆占位逻辑,v4 一个属性。

状态分流 · hx-status

v2 里按状态码分叉要配 responseHandling 数组;v4 收成一个属性——hx-status:422 让校验错误自动改道:

hx-status:422="target:#reg-err select:#reg-err-body"
200 走默认落点 #reg-ok;服务器返回 422 时改道 #reg-err,且只取响应里 #reg-err-body 那段——还支持 5xx50x 通配。

列表合并 · hx-swap="upsert"

v4 新交换策略:逐条比对 id,有则更新、无则插入、响应里没有的原样保留——列表不再整块重绘:

hx-swap="upsert sort"

第 01 条 · 初始

第 02 条 · 初始

第 03 条 · 初始

每点一次换一批增量,三批轮流:第一批 item-2 就地更新item-4/item-5 插入item-1/item-3 保留;第二批只更新已有两条;第三批补进 item-6sort 按 id 归位,焦点与滚动位置都不丢——这就是差异合并对整块替换的胜利。
这些演示合计不过几百字节 HTML 与几行服务端字符串——没有一行手写的 AJAX。
若你在离线阅读(如另存整站),演示会因连不上本站服务器而静默——这是 htmx 的优雅降级,不是坏了。
静态快照 · 部分演示需动态服务器