UNPKG

@vgbire/react-keep-alive

Version:
44 lines (43 loc) 1.79 kB
import { useCallback, useEffect, useId } from 'react'; import { useLocation, useMatches } from 'react-router'; import { useKeepAliveContext } from '..'; export const useRouterEffect = (callback, deps = []) => { const { activateds, setActivateds, deactivateds, setDeactivateds, nameKey } = useKeepAliveContext(); const { pathname } = useLocation(); // 设置为不缓存的,不需要将回调添加到activateds const matches = useMatches(); const id = useId(); const handleEffect = useCallback(() => { var _a; callback.id = id; if (!activateds[pathname]) { activateds[pathname] = []; } const index = activateds[pathname].findIndex((item) => item.id === id); if (index !== -1) { activateds[pathname].splice(index, 1); } const handle = matches[matches.length - 1].handle; const cache = (handle === null || handle === void 0 ? void 0 : handle[nameKey]) && ((_a = handle === null || handle === void 0 ? void 0 : handle.cache) !== null && _a !== void 0 ? _a : true); if (cache) { activateds[pathname].push(callback); setActivateds(Object.assign({}, activateds)); } // 执行callback const deactivated = callback(); if (deactivated) { if (!deactivateds[pathname]) { deactivateds[pathname] = []; } deactivateds[pathname].push(deactivated); setDeactivateds(Object.assign({}, deactivateds)); } return () => { delete activateds[pathname]; setActivateds(Object.assign({}, activateds)); }; }, [activateds, deactivateds, matches]); useEffect(() => { handleEffect(); }, [...deps]); };