La semana pasada, escribí sobre cómo modificar htmx para mostrar mensajes instantáneos. Una semana después de usar HTMX, necesitaba más. Quería una mejor manera de transmitir HTML desde el servidor, usando componentes JSX en lugar de cadenas HTML simples para una mejor usabilidad del código.
? Recordatorio rápido: si esto te resulta útil, ¡dale el visto bueno! Tu apoyo me ayuda a crear más contenido.
La idea es simple. Mi componente Conversación está incluido en un div con hx-ext="ws", que se conecta a mi backend cuando se procesa.
export const Conversation = (props: { messages: Message[] }) => ();{props.messages.reverse().map((message) => ())}
Lo siguiente importante es el InputMessageForm. Simplemente agregue ws-send al formulario y enviará un mensaje donde la clave es el ID del área de texto (messageInput) con su valor.
export const InputMessageForm = () => ();
Aquí está el bloque de código completo para el servidor Hono. Algunos registros de la consola para abrir y cerrar la conexión. onMessage es donde ocurre la magia.
get( '/chatroom-ws', upgradeWebSocket((c) => { return { onOpen: () => { console.log('WS Connection open'); }, onClose: () => { console.log('WS Connection closed'); }, onMessage: async (event, ws) => { const { userMessage } = JSON.parse(event.data.toString()); console.log('Got user message', userMessage); const inputArea = await c.html(, ); ws.send(await inputArea.text()); const htmlUser = await c.html( , ); ws.send(await htmlUser.text()); const response = await talk(userMessage); const htmlAgent = await c.html( , ); ws.send(await htmlAgent.text()); }, }; }), );
Entonces el flujo es:
Enviar la respuesta fue un poco problemático ya que los documentos son hmm... creo que no es tan fácil de entender. Incluso se ha creado un problema para solucionar este problema: mejorar la documentación para la extensión websocket. ¡Eso me ayudó mucho!
Entonces lo más importante es:
¡Debes devolver una cadena, que se analiza en html que tiene la misma identificación que el elemento que deseas intercambiar!
Entonces el problema n°. 1
Accidentalmente envié algo como esto:
JSON.stringify('test 123') // '"test 123"'
Esto está mal. ¡Tenga en cuenta los caracteres de identificación y escape! No encadene la cadena aquí.
El problema n°. 2
Podrías pensar que puedes devolver algo y que se cambiará donde quieras. No exactamente. El primer div es solo información para HTMX sobre qué hacer. ¿Al menos yo lo entiendo así?.
Estoy devolviendo html como este:
Solo se agrega dentro del
existente en el lado del cliente.https://assets.super.so/c0fc84d8-fb32-4194-8758-4be657666aab/videos/c814dcd2-b9e9-4bb2-b8db-2ed9cd7819b7/lucy-chat-example.mov
? ¿Te ayuda esta publicación? ¡Por favor envía spam al botón Me gusta! Tu apoyo es increíble. ¡Gracias!
¡Estén atentos para obtener más información y tutoriales! ¿Visitar mi blog?
Descargo de responsabilidad: Todos los recursos proporcionados provienen en parte de Internet. Si existe alguna infracción de sus derechos de autor u otros derechos e intereses, explique los motivos detallados y proporcione pruebas de los derechos de autor o derechos e intereses y luego envíelos al correo electrónico: [email protected]. Lo manejaremos por usted lo antes posible.
Copyright© 2022 湘ICP备2022001581号-3