reactjs - 在 ReactJs 中添加查询参数时返回按钮不起作用
问题描述
让我介绍一下我正在做的导致问题的原因。我的 React Web 应用程序中有 3 条路由:
"/"
为主页。"/page2"
对于第 2 页。"/page3"
对于第 3 页。
现在,当我继续进行路由时"/page2"
,我正在做什么,我在 URL 中推送一个查询参数,以呈现 page2 中的默认选项卡,使 URL 为"/page2?activeTab=tabId
“。所以简而言之,当我尝试去"/page2"
它时,它将始终将 URL 设为"/page2?activeTab=tabId"
.
现在的问题是当我第一次登陆 Page2 并尝试按下浏览器上的后退按钮时。我一次又一次地重新渲染page2。原因是:假设我第一次在 page2 上,并且 URL 将是"/page2?activeTab=tabId"
. 现在,当我按下后退按钮时,浏览器会删除查询参数并呈现 URL "/page2"
。因此,每当 URL 再次呈现我的代码时,都会将其转换为"/page2?activeTab=tabId"
. 因此,我无法返回并仅停留在第二页。
我需要这方面的帮助。如何消除或避免这个问题?
解决方案
您可以检查位置搜索参数,如果为空,则计算新路径 URL 并替换历史记录中的当前位置。
- 检查位置搜索查询
- 如果搜索查询为空,则使用查询字符串构造新的路径 URL
- 重定向(替换)当前页面,以便后退按钮起作用
使用 react-router-dom 的useHistory和useLocation反应钩子
const MyComponent = () => {
const { replace } = useHistory();
const { pathname, search } = useLocation();
useEffect(() => {
const tabId = <compute tab id>;
const newPath = `${pathname}?activeTab=${tabId}`;
if (!search) replace(newPath);
}, [pathname, replace, search]);
return (
...
);
};
如果不能使用 react-router-dom 的 react hooks,那么你可以使用withRouter高阶组件来装饰你的组件,并从注入的 props 中访问相同的值。
const MyComponent = ({ history, location }) => {
const { replace } = history;
const { pathname, search } = location;
useEffect(() => {
const tabId = <compute tab id>;
const newPath = `${pathname}?activeTab=${tabId}`;
if (!search) replace(newPath);
}, [pathname, replace, search]);
return (
...
);
};
export withRouter(MyComponent);
推荐阅读
- c - 如何在 5 位表示上模拟二进制补码算法?
- mysql - 更改mysql版本时插入主键的问题
- kibana - 将 kibana 仪表板一个帐户导入另一个帐户时出现问题
- react-native - 反应原生 socket.io 是 server_error
- onclick - 奇怪的输出:[object HTMLInputElement]+
- python - 无法在 PyCharm 中运行但能够在终端中运行
- git - 关于看起来未使用的 git big blob 的问题
- react-native - React Native LinkedIn 身份验证
- c++ - 如何循环一个函数?
- node.js - Discord.js 获取服务器所有者用户标签返回 null