You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

69 lines
2.0 KiB
TypeScript

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

import {defineStore} from "pinia";
import {computed, ref} from "vue";
export const useCameraBindStore=defineStore('cameraBind',()=>{
// 存储已绑定的摄像头id及其绑定的组件信息
const boundCameras=ref<Map<number,{
val:number,
type: string,
title: string
}>>(new Map());
// 检查摄像头是否已被绑定
const isCameraBound = (cameraId: number ) => {
return boundCameras.value.has(cameraId);
};
// 获取摄像头的绑定信息
const getCameraBindsInfo=(cameraId:number )=>{
return boundCameras.value.get(cameraId);
}
// 绑定摄像头
const bingCamera=(cameraId:number,obj:any)=>{
if(isCameraBound(cameraId))
{
return false;
}
boundCameras.value.set(cameraId,{
val:cameraId,
type:obj.type,
title:obj.title
});
return true;
}
// 解绑摄像头
const unbindCamera=(cameraId:number)=>{
boundCameras.value.delete(cameraId);
}
// 获取所有已经绑定的摄像头ID列表
const getBoundCameraIds=computed(()=>{
return Array.from(boundCameras.value.keys());
})
return {
boundCameras,
isCameraBound,
getCameraBindsInfo,
bingCamera,
unbindCamera,
getBoundCameraIds
}
},{
// 第三个参数:配置持久化
persist: {
key: 'camera-bind-store', // 存储在 localStorage 中的键名,可自定义
storage: localStorage, // 默认是 localStorage如果想关闭页面失效可改为 sessionStorage
serializer: {
// 序列化:将 Mp 转换为 [[key, value], [key, value]] 的二维数组存入 JSON
serialize: (state) => {
return JSON.stringify({
boundCameras: Array.from(state.boundCameras.entries())
});
},
// 反序列化:将 JSON 中的二维数组解析并重新构建为 Map 对象
deserialize: (value) => {
const parsed = JSON.parse(value);
return {
boundCameras: new Map(parsed.boundCameras)
};
}
}
}
})