htmx

请求

一次 htmx 请求 = 触发动词就近采集的表单数据 + 你追加的一切。注意 v4 变更:GET 与 DELETE 不再自动携带所在表单,需要时显式 hx-include。本章讲清载荷、观感、并发与服务器的反向遥控器

请求里装什么

表单里的 name 值是天然的载荷来源——htmx 沿 DOM 向上找到最近的 <form> 收集之。增减载荷靠这些属性:

属性职责
hx-include额外采集指定元素的值(选择器),甚至 hx-include='this' 收集自身;v4 里 GET/DELETE 带表单全靠它
hx-vals注入 JSON 字面量参数;js: 前缀动态求值(v4 已把旧 hx-vars 并入此处)
hx-headers附加请求头(如 CSRF、API Key)
hx-encoding改写序列化:multipart/form-data、或 json 编码的自定义序列化
hx-validate值为 true 时,即使无 required 也强制走浏览器校验
hx-config元素级请求配置(v4 由旧 hx-request 更名,取 HCON 语法)
v4 删除了 hx-params——参数过滤改由 htmx:config:request 事件完成:在 evt.detail.ctx.request.body(FormData)上删改即可。
组合拳 · 搜索框带上下文(v4)
<input name="q"
       hx-get="/results"
       hx-include="#date-filter"
       hx-vals='js:{page: 1, ts: Date.now()}'
       hx-headers='{"X-Source": "topbar"}'>

请求的体面

  • 指示器:请求进行中,htmx 给触发元素与 hx-indicator 所指元素挂上 .htmx-request 类——样式表里让 spinner 显形即可;
  • 确认框hx-confirm 的文案在点击后、请求前弹出——危险操作的第一道闸;
  • 禁用态:v4 用 hx-disable 在请求期间禁用指定元素,配合 :disabled 样式避免重复提交;
  • 错误通道:非预期状态码触发 htmx:response:error,网络断则 htmx:error,均可 document 级收口。v4 默认换入除 204/304 外的一切响应——想让 4xx/5xx 不换入,配 noSwap 或用 hx-status 定制。

并发调度 hx-sync

同一元素短促连点,请求们谁说了算?hx-sync 给出四种队列策略:

写法行为
hx-sync='this' + :drop已有在途请求则新请求直接丢弃
... :replace新请求取代在途者(旧的响应作废)
... :queue all|first|last排队:全排 / 排最前 / 只留最新
hx-sync='#group' + hx-sync-include其他元素为同步组——表格行内编辑的经典护栏

回声演示

表单即接口 · hx-post + hx-delete
提交后服务器生成一张回声卡片、以 afterbegin 叠在列表头部;每张卡片自带 hx-delete 按钮与 hx-confirm——删除由服务器文案驱动确认框。

响应头协议:服务器的遥控器

htmx 与服务器之间有一小套响应头方言,不占一字节 HTML 却能指挥浏览器:

响应头效果
HX-Trigger值为事件名,浏览器广播之——跨组件解耦的总闸(v4 已把旧的 HX-Trigger-After-Swap / -After-Settle 合并进来)
HX-Redirect令客户端整页跳转(认证过期踢回登录页的利器)
HX-Refresh值为 true 时强制刷新当前页
HX-Push-Url更新地址栏,或 false 表示不留历史
HX-Retarget服务器临时改换本次响应的落点选择器
HX-Reswap服务器临时改写本次响应的 hx-swap 策略
v4 请求头侧也有变化:旧的 HX-Trigger 请求头更名为 HX-Source,格式从元素 id 变为 tag#id(如 button#submit);并新增 HX-Request-Typefull / partial)。

请求的诸事已毕。下一章 扩展,看看 htmx 生态如何长出 WebSockets、SSE 与模板引擎的枝蔓。

静态快照 · 部分演示需动态服务器