@vgbire/react-keep-alive
Version:
React keepAlive
40 lines (39 loc) • 1.51 kB
JavaScript
import React, { useContext, useState, createContext, useEffect } from 'react';
const KeepAliveScopeContext = createContext({ activateds: {}, deactivateds: {} });
KeepAliveScopeContext.displayName = 'KeepAliveScope';
export const KeepAliveScope = ({ children }) => {
const [active, setActive] = useState('');
const [activateds, setActivateds] = useState({});
const [deactivateds, setDeactivateds] = useState({});
useEffect(() => {
var _a;
// 调用activateds
if ((_a = activateds[active]) === null || _a === void 0 ? void 0 : _a.length) {
activateds[active].forEach((item) => {
const deactivated = item();
if (deactivated) {
if (!deactivateds[active]) {
deactivateds[active] = [];
}
deactivateds[active].push(deactivated);
setDeactivateds(Object.assign({}, deactivateds));
}
});
}
}, [active]);
return (React.createElement(KeepAliveScopeContext.Provider, { value: {
active,
setActive,
activateds,
setActivateds,
deactivateds,
setDeactivateds,
} }, children));
};
export const useKeepAliveScopeContext = () => {
const context = useContext(KeepAliveScopeContext);
if (!context) {
throw new Error('useKeepAliveScopeContext 必须在 KeepAliveScope 中使用');
}
return context;
};