使用htmxjs将数据加载到表单中
我正在使用HTMXJS一个 javascript 库,它允许您直接在 HTML 中访问 AJAX。
虽然了解了HTMX的基本逻辑,但还是有一些方面没搞懂。
我设法制作了一个表格并将数据写入服务器:
<form>
<input type="text" name="firstname">
<input type="text" name="secondname">
<button type="button"
hx-post="write.php"
hx-target="#container-div"
hx-swap="innerHTML">
Submit
</button>
</form>
<div></div>
HTMX 将读取所有name内容并将它们提交到write.php可以使用以下循环读取的位置$_POST:
写.php:
foreach ($_POST as $key => $value) {
echo "Field ".htmlspecialchars($key)." is ".htmlspecialchars($value)."<br>";
}
我不明白如何用服务器返回的数据填充表单。例如,给定以下表单和以下输出,我想INPUT在按下按钮时填充单个字段:
HTML:
<button type="button"
hx-get="load.php"
hx-target="#my-form"
hx-swap="innerHTML">
Load data
</button>
<form>
<input type="text" name="firstname">
<input type="text" name="secondname">
</form>
加载.php:
$a = array(
"firstname" => "John",
"secondname" => "Smith",
);
echo json_encode($a);
我知道文档说“当你使用 htmx 时,在服务器端你通常用 HTML 响应,而不是 JSON ”,但这是否意味着服务器输出应该是像这样再次呈现表单所需的整个 HTML 代码?
echo "
<form>
<input type="text" name="firstname" value="John">
<input type="text" name="secondname" value="Smith">
</form>
";
如果表单有几十个字段、长选择菜单和复杂的复选框组会怎样?会不会是从服务器传递到客户端的大量数据?
我很确定我错过了一些东西......
回答
您的理解是正确的:htmx 会期望您返回要用于填充表单的所有 HTML。
这可能看起来效率低下,但事实证明 HTML 压缩得很好,并且典型的有效负载并不比等效的 JSON 大多少。 这篇博客文章概述了为什么会这样。
此外,即使负载较大,传输时间也常常与连接建立和处理时间相形见绌。htmx 不需要任何客户端模板,因此可以比许多需要的基于 JSON 的 UI 设置快得多。intercooler.js,htmx 的前身,源于我编写的一个小辅助函数,因为我正在处理一个巨大的 JSON 表,而且它需要很长时间。我发现仅仅以 HTML 形式接收表格并将其放入 DOM 的速度要快几个数量级。
说了这么多,我不想驳回你的问题。有几种方法可以在 htmx 中缩小您的有效载荷:
- 您可以使用hx-target缩小更新到最少 HTML 的区域
- 您可以使用带外交换来定位要更换的特定项目
- 推来推去,您可以使用HX-Trigger标头将数据直接传递给 javascript 事件处理程序以填充您的表单
但是,在做任何这些之前,我建议您只尝试无聊、简单的方法,看看性能是否可以接受。我猜答案是肯定的,并且您会发现,无论通过更复杂的解决方案可能实现的任何小的性能提升,减少的维护负担都是值得的。