gpt4 book ai didi

javascript - 在浏览器后退按钮上滚动到顶部单击 react

转载 作者:行者123 更新时间:2023-12-05 02:31:07 25 4
gpt4 key购买 nike

每当我的项目中的 URL 发生变化时(以及页面重新加载时),我都需要滚动到顶部。

一切正常,但浏览器后退按钮出现问题。即使路径名发生变化,页面也没有按预期滚动到顶部,它适用于所有其他情况(页面重新加载和常规链接导航)。

我试图通过为后退按钮创建一个自定义 Hook 来解决这个问题,但它并没有按照我想要的方式运行。我还尝试了很多其他的东西,但对于浏览器后退按钮似乎没有任何作用

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 而不是为“popstate”事件使用事件监听器。 Hook 以明确检查 POP 事件类型。

注意:为beforeunload 事件使用window.addEventListener,这样您就不会污染/改变窗口 对象。

例子:

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 (
...
);
}

Edit scroll-to-top-on-browser-back-button-click-react

关于javascript - 在浏览器后退按钮上滚动到顶部单击 react ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71665617/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com