<!DOCTYPE html><html lang="en"><head><meta charset="UTF-8"><title>FastAPI + Vue 3 WebSocket</title><!-- 引入 Vue 3 CDN --><script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><style>body { font-family: sans-serif; padding: 20px; }.chat-box { border: 1px solid #ccc; padding: 10px; height: 300px; overflow-y: scroll; margin-bottom: 10px; }.message { margin: 5px 0; }</style></head><body><div id="app"><h1>WebSocket Chat (FastAPI)</h1><!-- 消息显示区域 --><div class="chat-box"><div v-for="(msg, index) in messages" :key="index" class="message">{{ msg }}</div></div><!-- 输入框:绑定 messageInput,回车键触发 sendMessage --><input v-model="messageInput" @keyup.enter="sendMessage" placeholder="Type a message..." /><button @click="sendMessage">Send</button><p>Status: {{ status }}</p></div>
<script>const { createApp, ref, onMounted, onUnmounted } = Vue;
createApp({setup() {// 响应式状态定义const messages = ref([]); // 存储聊天记录const messageInput = ref(''); // 输入框内容const status = ref('Disconnected'); // 连接状态let ws = null; // WebSocket 实例// 生成一个随机的客户端 ID 用于演示const clientId = Date.now();
// 连接 WebSocket 函数const connect = () => {// 创建 WebSocket 连接,指向 FastAPI 后端ws = new WebSocket(`ws://localhost:8005/ws/${clientId}`);// 连接打开事件ws.onopen = () => {status.value = 'Connected';messages.value.push('System: Connected to server');};
// 收到消息事件ws.onmessage = (event) => {// 将收到的消息添加到列表messages.value.push(event.data);};
// 连接关闭事件ws.onclose = () => {status.value = 'Disconnected';};};
// 发送消息函数const sendMessage = () => {if (messageInput.value && ws && ws.readyState === WebSocket.OPEN) {// 发送消息到服务器ws.send(messageInput.value);// 清空输入框messageInput.value = '';}};
// 组件挂载时自动连接onMounted(() => {connect();});
// 组件卸载时关闭连接,防止资源泄漏onUnmounted(() => {if (ws) ws.close();});
return { messages, messageInput, sendMessage, status };}}).mount('#app');</script></body></html>
websocket前端基础示例vue3案例
| Title | websocket前端基础示例vue3案例 |
|---|---|
| Framework | Vue3 |
| User | wy8817399@vip.qq.com |
| Id | 67 |
| Created | 3/7/26, 7:41 PM |
| Modified | 3/7/26, 7:41 PM |
| Published | Yes |
Content