Files
yunrui_asset/frontend/src/context/Scene3DContext.jsx
T
zhang1106 afc372a432 chore: 统一代码风格并配置ESLint和Prettier
配置ESLint和Prettier规则
添加前端和后端的忽略文件
统一代码格式和缩进
修复代码风格问题
2026-02-10 11:04:01 +08:00

122 lines
3.0 KiB
React

import React, { createContext, useContext, useState, useMemo, useCallback } from 'react';
// 3D场景状态上下文
// 将3D场景状态与UI状态分离,避免不必要的重渲染
const Scene3DContext = createContext(null);
export const Scene3DProvider = ({ children }) => {
// 3D场景相关状态
const [devices, setDevices] = useState([]);
const [selectedDevice, setSelectedDevice] = useState(null);
const [hoveredDevice, setHoveredDevice] = useState(null);
const [deviceSlideEnabled, setDeviceSlideEnabled] = useState(false);
const [selectedRack, setSelectedRack] = useState(null);
const [racks, setRacks] = useState([]);
const [deviceCables, setDeviceCables] = useState([]);
const [loadingDevices, setLoadingDevices] = useState(false);
// 使用 useCallback 稳定回调函数
const selectDevice = useCallback(device => {
setSelectedDevice(device);
}, []);
const hoverDevice = useCallback(device => {
setHoveredDevice(device);
}, []);
const toggleDeviceSlide = useCallback(() => {
setDeviceSlideEnabled(prev => !prev);
}, []);
const setDeviceSlide = useCallback(enabled => {
setDeviceSlideEnabled(enabled);
}, []);
const updateDevices = useCallback(newDevices => {
setDevices(newDevices);
}, []);
const updateRacks = useCallback(newRacks => {
setRacks(newRacks);
}, []);
const selectRack = useCallback(rack => {
setSelectedRack(rack);
}, []);
const updateDeviceCables = useCallback(cables => {
setDeviceCables(cables);
}, []);
const setLoading = useCallback(loading => {
setLoadingDevices(loading);
}, []);
// 使用 useMemo 缓存 context value,避免不必要的重渲染
const value = useMemo(
() => ({
// 状态
devices,
selectedDevice,
hoveredDevice,
deviceSlideEnabled,
selectedRack,
racks,
deviceCables,
loadingDevices,
// 方法
selectDevice,
hoverDevice,
toggleDeviceSlide,
setDeviceSlide,
updateDevices,
updateRacks,
selectRack,
updateDeviceCables,
setLoading,
// 直接设置状态的方法(用于兼容现有代码)
setDevices,
setSelectedDevice,
setHoveredDevice,
setDeviceSlideEnabled,
setSelectedRack,
setRacks,
setDeviceCables,
setLoadingDevices,
}),
[
devices,
selectedDevice,
hoveredDevice,
deviceSlideEnabled,
selectedRack,
racks,
deviceCables,
loadingDevices,
selectDevice,
hoverDevice,
toggleDeviceSlide,
setDeviceSlide,
updateDevices,
updateRacks,
selectRack,
updateDeviceCables,
setLoading,
]
);
return <Scene3DContext.Provider value={value}>{children}</Scene3DContext.Provider>;
};
// 自定义 Hook
export const useScene3D = () => {
const context = useContext(Scene3DContext);
if (!context) {
throw new Error('useScene3D must be used within a Scene3DProvider');
}
return context;
};
export default Scene3DContext;