【发布时间】:2022-11-22 06:01:43
【问题描述】:
每次我的项目中的 URL 更改(以及页面重新加载)时,我都需要滚动到顶部。
一切正常,但浏览器后退按钮出现问题。即使路径名发生变化,页面没有按预期滚动到顶部,它也适用于所有其他情况(页面重新加载和常规链接导航)。
我试图通过为后退按钮创建一个自定义挂钩来解决这个问题,但它并没有按照我想要的方式运行。我还尝试了很多其他的东西,但对于浏览器后退按钮似乎没有任何作用
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;
【问题讨论】:
-
如果您使用的是单页 React 应用程序,我不希望
onbeforeunload在页面导航时触发,因为您实际上并没有离开页面。像这样的东西可能有用:Detect Route Change with react-router -
你可以创建一个链接并在里面创建一个按钮并放置 href=#
-
你是对的,但这只是为了页面重新加载。第一个 useEffect 用于导航和后退按钮
-
通过 const 路径名使用 useLocation 跟踪 url 更改,但由于某种原因,即使在按下浏览器后退按钮时 url 发生更改,也不会触发 scrollTo(0 ,0)
标签: javascript reactjs react-router-dom