react-router-dom V6 删除了usePrompt useBlocker
解决方案:
import { useContext, useEffect, useCallback } from 'react';
import { UNSAFE_NavigationContext as NavigationContext } from 'react-router-dom';
export function useBlocker (blocker, when = true) {
const { navigator } = useContext(NavigationContext);
useEffect(() => {
if (!when) return;
const unblock = navigator.block((tx) => {
const autoUnblockingTx = {
...tx,
retry () {
unblock();
tx.retry();
},
};
blocker(autoUnblockingTx);
});
return unblock;
}, [navigator, blocker, when]);
}
export function usePrompt (message, when = true) {
const { basename } = useContext(NavigationContext);
const blocker = useCallback(
(tx) => {
if (typeof message === "function") {
let targetLocation = tx?.location?.pathname;
if (targetLocation.startsWith(basename)) {
targetLocation = targetLocation.substring(basename.length);
}
if (message(targetLocation)) {
tx.retry();
}
} else if (typeof message === "string") {
if (window.confirm(message)) {
tx.retry();
}
}
},
[message, basename]
)
return useBlocker(blocker, when);
}
const [isAction, setIsAction] = useState(true)
使用1:usePrompt(function () {
setIsAction(false)
console.log('操作')
}, isAction);
使用2:usePrompt(‘内容未保存,是否取消?’, true);