请求
一次 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)上删改即可。<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 | 以其他元素为同步组——表格行内编辑的经典护栏 |
回声演示
提交后服务器生成一张回声卡片、以
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-Type(full / partial)。请求的诸事已毕。下一章 扩展,看看 htmx 生态如何长出 WebSockets、SSE 与模板引擎的枝蔓。