gpt4 book ai didi

reactjs - React Router 中的 matchPath 似乎没有考虑 Basename

转载 作者:行者123 更新时间:2023-12-03 13:19:23 25 4
gpt4 key购买 nike

我正在研究react-router-dom版本5.0.0的一个错误,并且事件类未应用于事件链接。

当我们的基本名称为 / 时,它可以在开发中工作,但在我们的开发环境中,基本名称设置为“/some/basename/”。

如果我像这样直接调用这个matchPath:

matchPath("/some/basename/business", {
exact: true,
location: undefined,
path: "\/business",
strict: undefined
})

然后它返回null,如果我像这样调用matchpath,它会得到一个匹配:

matchPath("/business", {
exact: true,
location: undefined,
path: "\/business",
strict: undefined
})

所以看起来 matchPath 没有使用 basename 因为在尝试调试代码后我发现 matchPath 调用 pathToRegexp 创建此正则表达式:

/^\/business\/?$/i

该代码似乎仅使用 path 属性,而不是 location.pathname。

我尝试实现自己的 isActive 方法来记录发生的情况:

const isActive = (match: Match<any>, historyLocation: Location) =>  {
const basename = (window.env.REACT_APP_BASE_URI || "/") === "/" ? "" : window.env.REACT_APP_BASE_URI;
const fullUrl = `${basename.replace(/^(.+?)\/*?$/, "$1")}${historyLocation.pathname}`;

console.log("----------------------");
console.log({
basename,
fullUrl,
historyLocation,
historyLocationPathName: historyLocation.pathname,
location: window.location.pathname,
match,
});
console.log("----------------------");

if (!match) {
return;
}

return window.location.pathname.startsWith(`${fullUrl}`);
};

match 在环境中始终为 null,但在开发中工作正常。

为什么会这样?

最佳答案

HTML 概念

这实际上是react-router的巨大优势之一,因为在开发阶段你不知道项目将部署在哪里。它可能部署在:

  • 主域
  • 子域
  • 子目录

所以最好的方法是提供定义所有相对 URL与基本 URL 无关的方式。 basename在 React-Router 中实际上并不是什么新鲜事,我们有 <base> HTML 中的 head 标签:

<head>
<base href="https://www.yoursite.com/some/basename/" target="https://www.yoursite.com/other/">
</head>

这个标签意味着页面中所有的相对URL都会有https://www.yoursite.com/some/basename/添加到其中,例如:

<img src="header.jpg">

相同
<img src="https://www.yoursite.com/some/basename/header.jpg">

所有相关链接和表单操作也将具有 href附加到它们。

<小时/>

react 路由器

React-Router 基本上使用了这个概念(但是,不是基本标签),所以当你设置 basename 时在 main ` 中,以下元素将对基本名称一无所知:

  • <Route>
  • <Link>
  • <Redirect>
  • matchPath

所以当你有这样的链接时:

<Link to="/page2" />

它实际上会重定向到/some/basename/page2 .

<小时/>

基本名称

  • React-Router Docs建议A properly formatted basename should have a leading slash, but no trailing slash. (例如/some/business)。然而,在大多数现代浏览器中,这根本不重要。
<小时/>

匹配路径

现在我们来谈谈matchPath。正如我之前所说,matchPath 不知道有关基本名称的任何信息,因此您请记住以下内容:

  • 确保输入 URL 中包含基本名称。
  • 不要不要使用window.location.pathname,而是使用React-Router位置属性

那你应该没问题。因此,无论您的环境如何(开发/产品),这都将始终有效:

matchPath(props.location.pathname, {
path: '/business',
exact: true,
});
<小时/>

注释

如果考虑到所有这些,您在整个项目中遇到了一些问题(包括所有链接、所有重定向、所有路由以及 matchPath),那么您的基本基本名称在生产环境中设置错误。

关于reactjs - React Router 中的 matchPath 似乎没有考虑 Basename,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56302254/

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