@vgbire/react-keep-alive
Version:
React keepAlive
44 lines (43 loc) • 1.79 kB
JavaScript
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]);
};