在浏览器后退按钮上滚动到顶部单击反应
Scroll to top on browser back button click react
每当我的项目 url 发生变化(以及页面重新加载)时,我都需要滚动到顶部。
一切正常,但浏览器后退按钮出现问题。即使路径名发生变化,页面也不会像它应该的那样滚动到顶部,它适用于所有其他情况(页面重新加载和常规 link 导航)。
我试图反驳为后退按钮创建自定义挂钩的做法,但它的行为并不如我所愿。我还尝试了很多其他的东西,但对于浏览器后退按钮似乎没有任何效果
import { useEffect, useState } from "react";
import { useLocation } from "react-router-dom";
const ScrollToTop = () => {
const { pathname } = useLocation();
const useBackButton = () => {
const [isBack, setIsBack] = useState(false);
const handleEvent = () => {
setIsBack(true);
};
useEffect(() => {
window.addEventListener("popstate", handleEvent);
return () => window.removeEventListener("popstate", handleEvent);
});
return isBack;
};
const backButton = useBackButton();
console.log(backButton);
useEffect(() => {
window.scrollTo(0, 0);
}, [pathname, backButton]);
useEffect(() => {
window.onbeforeunload = () => {
window.scrollTo(0, 0);
};
}, []);
return null;
};
export default ScrollToTop;
我认为 beforeunload
事件在这里不是必需的,但无论如何都会包含它。您可以使用 useNavigationType
挂钩来明确检查 POP 事件类型,而不是对“popstate”事件使用事件侦听器。
注意:对beforeunload
事件使用window.addEventListener
,这样你就不会pollute/mutate [=16] =]对象.
示例:
import { NavigationType, useLocation, useNavigationType } from "react-router-dom";
const useBackButton = () => {
const navType = useNavigationType();
return navType === NavigationType.Pop;
};
const useScrollToTop = () => {
const { pathname } = useLocation();
const isPop = useBackButton();
const scrollToTop = () => window.scrollTo(0, 0);
useEffect(() => {
scrollToTop();
}, [pathname, isPop]);
useEffect(() => {
window.addEventListener("beforeunload", scrollToTop);
return () => {
window.removeEventListener("beforeunload", scrollToTop);
};
}, []);
};
用法:
function App() {
useScrollToTop();
return (
...
);
}
每当我的项目 url 发生变化(以及页面重新加载)时,我都需要滚动到顶部。
一切正常,但浏览器后退按钮出现问题。即使路径名发生变化,页面也不会像它应该的那样滚动到顶部,它适用于所有其他情况(页面重新加载和常规 link 导航)。
我试图反驳为后退按钮创建自定义挂钩的做法,但它的行为并不如我所愿。我还尝试了很多其他的东西,但对于浏览器后退按钮似乎没有任何效果
import { useEffect, useState } from "react";
import { useLocation } from "react-router-dom";
const ScrollToTop = () => {
const { pathname } = useLocation();
const useBackButton = () => {
const [isBack, setIsBack] = useState(false);
const handleEvent = () => {
setIsBack(true);
};
useEffect(() => {
window.addEventListener("popstate", handleEvent);
return () => window.removeEventListener("popstate", handleEvent);
});
return isBack;
};
const backButton = useBackButton();
console.log(backButton);
useEffect(() => {
window.scrollTo(0, 0);
}, [pathname, backButton]);
useEffect(() => {
window.onbeforeunload = () => {
window.scrollTo(0, 0);
};
}, []);
return null;
};
export default ScrollToTop;
我认为 beforeunload
事件在这里不是必需的,但无论如何都会包含它。您可以使用 useNavigationType
挂钩来明确检查 POP 事件类型,而不是对“popstate”事件使用事件侦听器。
注意:对beforeunload
事件使用window.addEventListener
,这样你就不会pollute/mutate [=16] =]对象.
示例:
import { NavigationType, useLocation, useNavigationType } from "react-router-dom";
const useBackButton = () => {
const navType = useNavigationType();
return navType === NavigationType.Pop;
};
const useScrollToTop = () => {
const { pathname } = useLocation();
const isPop = useBackButton();
const scrollToTop = () => window.scrollTo(0, 0);
useEffect(() => {
scrollToTop();
}, [pathname, isPop]);
useEffect(() => {
window.addEventListener("beforeunload", scrollToTop);
return () => {
window.removeEventListener("beforeunload", scrollToTop);
};
}, []);
};
用法:
function App() {
useScrollToTop();
return (
...
);
}