¿Cómo se inserta “beforeend” con htmx y eventos enviados por el servidor?
Estoy utilizando htmx 1.6.1 y estoy experimentando con el soporte de eventos enviados por el servidor. Estoy implementando un chat sencillo y cuando un usuario envía un mensaje quiero que este mensaje se envíe a todos los participantes del chat. Por lo tanto, cuando recibo un nuevo mensaje en el servidor, lo convierto en un fragmento HTML y lo envío a cada cliente a través de la conexión SSE. Por ejemplo, cuando la página del chat se carga, devuelve este HTML con todos los mensajes del chat:
<ul hx-sse="connect:/chat" ...="">
<li>john: Mensaje del chat 1</li>
<li>jane: Mensaje del chat 2</li>
</ul>
Ahora, si “john” envía otro mensaje, como “hola”, a algún recurso, quiero enviar <li>john: hello</li>
a través de SSE a cada cliente, lo que resultaría en este HTML:
<ul hx-sse="connect:/chat" ...="">
<li>john: Mensaje del chat 1</li>
<li>jane: Mensaje del chat 2</li>
<li>john: hola</li>
</ul>
Pero no sé cómo hacer esto. He logrado activar un GET hacia el servidor después de recibir el evento SSE por parte del cliente para obtener nuevamente todo el “ul”, pero esto no es lo que quiero hacer. (Lo que creo) quiero hacer es insertar el contenido del evento SSE en “beforeend” de la etiqueta “ul”, sin hacer una solicitud adicional al servidor.
¿Cómo puedo lograr esto?
davy.ai
Para lograr esto, puedes usar el atributo
hx-trigger
proporcionado por htmx en el elemento que desencadena el evento (en este caso, el formulario que envía el mensaje de chat). Establece el valor dehx-trigger
asse
y agrega un evento personalizadohx-sse:received
al elementoul
que recibirá el nuevo mensaje de chat.Cuando el cliente recibe el evento SSE, htmx automáticamente desencadenará el evento
hx-sse:received
en el elementoul
, pasando los datos del evento como propiedaddetail
del evento. Puedes usar un escuchador de eventos para manejar el eventohx-sse:received
e insertar el nuevo mensaje de chat en el elementoul
.Aquí tienes un ejemplo de implementación:
En este ejemplo, el atributo
hx-post
en el formulario especifica el punto final para enviar un mensaje de chat. El atributohx-trigger="sse"
en el botón de envío le indica a htmx que desencadene una solicitud SSE después de enviar el formulario.El atributo
hx-sse
en el elementoul
especifica el punto final SSE al que conectarse, y el atributohx-sse:received
especifica el evento personalizado que se desencadena cuando se recibe un evento SSE.La función
insertarMensajeChat
es un controlador de eventos para el eventohx-sse:received
. Crea un nuevo elementoli
que contiene el mensaje de chat recibido en el evento SSE y lo agrega al elementoul
. Esto inserta el nuevo mensaje de chat en el contenido HTML de la página sin realizar una solicitud adicional al servidor.