<div hx-get="/mas-contenido" hx-trigger="revealed" hx-swap="afterend">
Cargando más contenido...
</div> revealed: Se dispara cuando el elemento se revela en la pantalla.hx-get: Realiza una petición GET al endpoint /mas-contenido.hx-trigger: Define el evento que dispara la petición.hx-swap: Define el modo de swap que se utilizará para insertar la respuesta.<button hx-get="/morecontent" hx-target="#content">Cargar más</button>
<div id="content">Contenido inicial</div> get: Se dispara cuando el usuario hace click en el botón.hx-get: Realiza una petición GET al endpoint /morecontent.hx-target: Define dónde se mostrará la respuesta.hx-swap: Define el modo de swap que se utilizará para insertar la respuesta.<div hx-get="/latest" hx-trigger="every 10s" hx-target="#scoreDisplay">
<span id="scoreDisplay">Cargando...</span>
</div> every: Se dispara cada 10 segundos.hx-get: Realiza una petición GET al endpoint /latest.hx-trigger: Define el evento que dispara la petición.hx-target: Define dónde se mostrará la respuesta.<button hx-get="/modal" hx-target="#modalContainer" hx-swap="afterend">
Mostrar Modal
</button>
<div id="modalContainer"></div> get: Se dispara cuando el usuario hace click en el botón.hx-get: Realiza una petición GET al endpoint /modal.hx-target: Define dónde se mostrará la respuesta.hx-swap: Define el modo de swap que se utilizará para insertar la respuesta.<form hx-post="/submit" hx-trigger="submit" hx-target="#respuesta">
<input type="text" name="nombre" />
<button type="submit">Enviar</button>
</form>
<div id="respuesta"></div> post: Se dispara cuando el usuario hace click en el botón.hx-post: Realiza una petición POST al endpoint /submit.hx-trigger: Define el evento que dispara la petición.hx-target: Define dónde se mostrará la respuesta y reemplaza el contenido.<button id="sub">Subscribe</button>
<script>
document.getElementById("sub").addEventListener("click", () => {
fetch("/subscribe", { method: "POST" })
.then((res) => res.text())
.then((html) => (document.getElementById("sub").outerHTML = html));
});
</script> <button id="sub" hx-post="/subscribe" hx-target="this" hx-swap="outerHTML">
Subscribe
</button> post: Se dispara cuando el usuario hace click en el botón.hx-post: Realiza una petición POST al endpoint /subscribe.hx-target: Define dónde se mostrará la respuesta y reemplaza el contenido.hx-swap: Define el modo de swap que se utilizará para insertar la respuesta.<button hx-post="/add" hx-target="#cart" hx-swap="outerHTML">
Añadir al carrito
</button>
<div id="cart">Carrito vacío</div> Son eventos que se disparan cuando ocurren ciertas acciones en el DOM.
<input
type="text"
hx-get="/search"
hx-trigger="keyup changed delay:300ms"
hx-target="#results"
/>
<div id="results"></div> load<div hx-get="/fetch-data" hx-trigger="load" hx-swap="innerHTML">Cargar</div> load: Se dispara cuando el elemento se carga en el DOM.hx-get: Realiza una petición GET al endpoint /fetch-data.hx-swap: Reemplaza el contenido del elemento.Mira cómo funciona en este caso, un div que al cargar la página, realiza una petición GET al endpoint /fetch-data y la respuesta se mostrará en el div.
click<button hx-get="/fetch-data" hx-trigger="click" hx-swap="innerHTML">
Cargar
</button> click: Se dispara cuando el usuario hace click en el elemento.hx-get: Realiza una petición GET al endpoint /fetch-data.hx-swap: Reemplaza el contenido del elemento.En este caso, se muestra un botón que al hacer click, realiza una petición GET al endpoint /fetch-data y la respuesta se mostrará en el botón.
change<input type="text" hx-get="/search" hx-trigger="change" hx-target="#results" />
<div id="results"></div> change: Se dispara cuando el valor del input cambia.hx-get: Realiza una petición GET al endpoint /search.hx-target: Define dónde se mostrará la respuesta.En este escenario, se observa un input que al cambiar su valor, realiza una petición GET al endpoint /search y la respuesta se mostrará en el div con el id results.
keyup<input type="text" hx-get="/search" hx-trigger="keyup" hx-target="#results" />
<div id="results"></div> keyup: Se dispara cuando el usuario presiona una tecla.hx-get: Realiza una petición GET al endpoint /search.hx-target: Define dónde se mostrará la respuesta.En este contexto, se ve un input que al presionar una tecla, realiza una petición GET al endpoint /search y la respuesta se mostrará en el div con el id results.
blur<input type="text" hx-get="/search" hx-trigger="blur" hx-target="#results" />
<div id="results"></div> blur: Se dispara cuando el usuario pierde el enfoque del input.hx-get: Realiza una petición GET al endpoint /search.hx-target: Define dónde se mostrará la respuesta.En este contexto, se mira como un input que al perder el enfoque, realiza una petición GET al endpoint /search y la respuesta se mostrará en el div con el id results.
focus<input type="text" hx-get="/search" hx-trigger="focus" hx-target="#results" />
<div id="results"></div> focus: Se dispara cuando el usuario obtiene el enfoque del input.hx-get: Realiza una petición GET al endpoint /search.hx-target: Define dónde se mostrará la respuesta.A continuación, se muestra como un input que al obtener el enfoque, realiza una petición GET al endpoint /search y la respuesta se mostrará en el div con el id results.
change<input type="text" hx-get="/search" hx-trigger="change" hx-target="#results" />
<div id="results"></div> change: Se dispara cuando el valor del input cambia.hx-get: Realiza una petición GET al endpoint /search.hx-target: Define dónde se mostrará la respuesta.En este caso, se demuestra cómo un input que al cambiar su valor, realiza una petición GET al endpoint /search y la respuesta se mostrará en el div con el id results.
hx-targetLos atributos Targets nos permiten especificar, mediante selectores de CSS, donde se mostrará la respuesta de la request realizada.
Por ejemplo:
<button hx-post="/add" hx-target="#cart" hx-swap="outerHTML">
Añadir al carrito
</button>
<div id="cart">Carrito vacío</div> Al hacer click en el botón, se realizará una petición POST al endpoint /add y la respuesta se mostrará en el elemento con el id cart.
const express = require("express");
const bodyParser = require("body-parser");
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
let count = 0;
app.post("/increment", (req, res) => {
count++;
res.send(`${count}`);
});
app.listen(3000, () => console.log("http://localhost:3000")); Y en el HTML:
<div>
Count: <span id="count" hx-swap="innerHTML">0</span>
<button hx-post="/increment" hx-target="#count">Increment</button>
</div> Con HTMX:
<div>
Count: <span id="count" hx-swap="innerHTML">0</span>
<button hx-post="/increment" hx-target="#count">Increment</button>
</div> post: Se dispara cuando el usuario hace click en el botón.hx-post: Realiza una petición POST al endpoint /increment.hx-target: Define dónde se mostrará la respuesta y reemplaza el contenido.hx-swap: Define el modo de swap que se utilizará para insertar la respuesta.const express = require("express");
const bodyParser = require("body-parser");
const app = express();
app.use(bodyParser.urlencoded({ extended: true }));
let count = 0;
app.post("/increment", (req, res) => {
count++;
res.send(`${count}`);
});
const PORT = 3000;
app.listen(PORT, () => {
console.log(`Servidor corriendo en http://localhost:${PORT}`);
}); con React:
import { useState } from "react";
export default function Counter() {
const [count, setCount] = useState(0);
return (
<>
<p>Count: {count}</p>
<button onClick={() => setCount(count + 1)}>Increment</button>
</>
);
} HTMX permite integrar CSS para mostrar un indicador de carga, aprovechando las animaciones CSS.
Ofrece el atributo hx-indicator para mostrar un indicador de carga.
<div id="caja" hx-get="/fetch" hx-trigger="click" hx-indicator="#loader">
Cargar
</div>
<div id="loader" style="display: none;">Cargando...</div> indicator: Se dispara cuando el usuario hace click en el elemento.hx-get: Realiza una petición GET al endpoint /fetch.hx-trigger: Define el evento que dispara la petición.hx-indicator: Define el elemento que se mostrará como indicador de carga.