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 {children}; }; // 自定义 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;