gio*_*san 5 javascript reactjs react-router-dom
每次项目中的 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;
Run Code Online (Sandbox Code Playgroud)
我认为beforeunload这里没有必要举办这个活动,但无论如何都会包括在内。useNavigationType您可以使用挂钩来明确检查 POP 事件类型,而不是使用“popstate”事件的事件侦听器。
注意:用于window.addEventListener事件beforeunload,这样就不会污染/改变window对象。
例子:
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);
};
}, []);
};
Run Code Online (Sandbox Code Playgroud)
用法:
function App() {
useScrollToTop();
return (
...
);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5096 次 |
| 最近记录: |