// useWebSocket.js
|
import { ref, reactive, onMounted, onUnmounted } from "vue";
|
import getWsUrl from "@/assets/js/getWsUrl";
|
|
export default function (url) {
|
url = getWsUrl(url);
|
|
const socket = ref(null);
|
const isConnected = ref(false);
|
const message = ref("");
|
|
const sendCallback = reactive([]);
|
|
const connect = () => {
|
if (socket.value) {
|
socket.value.close();
|
}
|
socket.value = new WebSocket(url);
|
|
socket.value.onopen = () => {
|
isConnected.value = true;
|
console.log("WebSocket Connected, url: ", url);
|
sendCallback.forEach(v => v());
|
sendCallback.length = 0;
|
};
|
|
socket.value.onmessage = (event) => {
|
// 处理接收到的消息
|
// console.log("Received:", event.data);
|
// 可以在这里通过 emit 发送消息到组件
|
message.value = event.data;
|
};
|
|
socket.value.onerror = (error) => {
|
console.error("WebSocket Error:", error, url);
|
};
|
|
socket.value.onclose = () => {
|
isConnected.value = false;
|
console.log("WebSocket 连接已关闭, url: ", url);
|
};
|
};
|
|
// 发送数据
|
const sendData = (data) => {
|
if (socket.value && socket.value.readyState === socket.value.OPEN) {
|
// console.log('send', data, '=============');
|
socket.value.send(data);
|
} else {
|
sendCallback.push(() => sendData(data));
|
}
|
};
|
|
onMounted(() => {
|
connect();
|
});
|
|
onUnmounted(() => {
|
if (socket.value) {
|
socket.value.close();
|
}
|
});
|
|
// 返回 socket 对象和状态
|
return { socket, isConnected, message, sendData };
|
}
|