下面给你一份 前端 Vue 中使用 SignalR 的方法与完整示例详解(适用于 Vue2 / Vue3、TypeScript / JavaScript)。
内容包括:
✔ 如何安装并初始化 SignalR
✔ Vue3 + Composition API 示例
✔ Vue2 + Options API 示例
✔ 自动重连、断线处理
✔ 封装成可复用的模块
✔ 使用 Element Plus 做简单 UI 提示(可选)
✅ 一、SignalR 简介(前端视角)
SignalR 是微软推出的 实时通讯框架,可以让前端实时接收后端的消息推送,例如:
- 实时消息通知
- 在线用户状态
- 聊天室
- 实时监控面板
- 数据更新的实时广播
✅ 二、安装 SignalR 客户端
npm install @microsoft/signalr
Vue2 / Vue3 都一样。
✅ 三、Vue3 + Composition API 使用 SignalR(推荐)
下面是最简示例(连接、接收消息、发送消息)。
📌 1. 创建一个 SignalR 连接模块(可复用)
src/utils/signalr.js
import * as signalR from "@microsoft/signalr";
let connection = null;
export function initSignalR(url) {
connection = new signalR.HubConnectionBuilder()
.withUrl(url)
.withAutomaticReconnect()
.configureLogging(signalR.LogLevel.Information)
.build();
return connection;
}
export function getConnection() {
return connection;
}
📌 2. 在 Vue3 组件中使用
<script setup>
import { onMounted, onBeforeUnmount, ref } from 'vue';
import { initSignalR, getConnection } from '@/utils/signalr';
const messages = ref([]);
onMounted(async () => {
const connection = initSignalR("https://localhost:5001/chatHub");
// 接收后端推送的消息
connection.on("ReceiveMessage", (user, message) => {
messages.value.push(`${user}: ${message}`);
});
// 启动连接
try {
await connection.start();
console.log("SignalR 已连接");
} catch (err) {
console.log("连接失败:", err);
}
});
onBeforeUnmount(() => {
const connection = getConnection();
connection?.stop();
});
</script>
<template>
<div>
<h3>SignalR 消息: </h3>
<p v-for="msg in messages" :key="msg">{{ msg }}</p>
</div>
</template>
📌 3. 前端发送消息(调用 server 方法)
const sendMessage = async () => {
const connection = getConnection();
await connection.invoke("SendMessage", "阿杰", "你好!");
};
后端 SignalR Hub 需要有对应方法:
public async Task SendMessage(string user, string message)
{
await Clients.All.SendAsync("ReceiveMessage", user, message);
}
✅ 四、Vue2 + Options API 示例
<script>
import * as signalR from '@microsoft/signalr';
export default {
data() {
return {
messages: [],
connection: null
};
},
created() {
this.connection = new signalR.HubConnectionBuilder()
.withUrl("https://localhost:5001/chatHub")
.withAutomaticReconnect()
.build();
this.connection.on("ReceiveMessage", (user, msg) => {
this.messages.push(`${user}: ${msg}`);
});
this.connection.start().catch(err => console.error(err));
},
beforeDestroy() {
this.connection?.stop();
}
}
</script>
<template>
<div>
<h3>消息</h3>
<p v-for="(msg,i) in messages" :key="i">{{ msg }}</p>
</div>
</template>
✅ 五、自动重连 / 断线处理
SignalR 内置自动重连,只需要:
.withAutomaticReconnect()
你可以监听事件:
connection.onreconnecting(error => {
console.log("正在重连...", error);
});
connection.onreconnected(connectionId => {
console.log("重连成功", connectionId);
});
connection.onclose(error => {
console.log("连接已关闭", error);
});
✅ 六、将 SignalR 封装成全局插件(Vue3)
src/plugins/signalr.js
import * as signalR from "@microsoft/signalr";
export default {
install(app, options) {
const connection = new signalR.HubConnectionBuilder()
.withUrl(options.url)
.withAutomaticReconnect()
.build();
app.config.globalProperties.$signalr = connection;
connection.start().catch(err => console.log(err));
}
};
在 main.js 中使用:
import signalR from "./plugins/signalr";
app.use(signalR, { url: "https://localhost:5001/chatHub" });
组件中使用:
this.$signalr.invoke("SendMessage", "阿杰", "Hello!");
✅ 七、SignalR + Element Plus 提示(可选)
import { ElNotification } from "element-plus";
connection.on("ReceiveMessage", (user, message) => {
ElNotification({
title: user,
message: message
});
});
🎯 总结(可复制)
| 场景 | 使用方法 |
|---|---|
| 初始化连接 | HubConnectionBuilder(…) |
| 自动重连 | withAutomaticReconnect() |
| 接收消息 | connection.on(“ReceiveMessage”) |
| 发送消息 | connection.invoke(“SendMessage”) |
| Vue3 使用 | Composition API |
| Vue2 使用 | Options API |
| 封装 | utils / plugin |
发表回复