使用 Redirect 组件的路径名时,React HashRouter 有两个哈希符号“#”

Posted

技术标签:

【中文标题】使用 Redirect 组件的路径名时,React HashRouter 有两个哈希符号“#”【英文标题】:React HashRouter is having two hash symbols '#' when using Redirect component's pathname 【发布时间】:2021-08-27 12:01:50 【问题描述】:

我在我的应用程序中使用"react-router-dom": "^5.2.0"。我已经使用它的HashRouter 来处理我的路由。我的根路由应与现有查询字符串一起重定向到特定路由。我遇到的问题是,一旦我使用了Redirect 组件的pathName,它就会在我的 URL 中添加两个“#”符号。

当前行为: mydomain.org/myApp#/?someParam=someValue => mydomain.org/myApp#/CompA#/?someParam=someValue

预期行为: mydomain.org/myApp#/?someParam=someValue => mydomain.org/myApp#/CompA/?someParam=someValue

这是我所做的

import React from 'react';
import  Redirect, HashRouter, Route, Switch  from 'react-router-dom';

const App: React.FC<any> = (props: any) => 

  return (
      <HashRouter>
        <Switch>
          <Route exact key="/" path="/">
            <RedirectComp to="/CompA" />
          </Route>
          <Route exact key="/CompA" path="/CompA">
            <CompA />
          </Route>
        </Switch>
      </HashRouter>
  );
;

const RedirectComp: React.FC<any> = (props: any) => 
  return (
    <Redirect to= ...location, pathname: props.to  />
  );

我使用自定义组件进行重定向的原因是在重定向时保留 queryString。这就是为什么我不能使用&lt;Redirect to="/CompA" /&gt;

有没有一种更简洁的方法来实现这一点,而无需在 Location.hash 中进行字符串搜索并更新它?

【问题讨论】:

【参考方案1】:

看起来您使用的是全局 location 对象,而不是 Redirect 期望的位置。在RedirectComp 中,使用useLocation() 挂钩获取位置。两个Location 对象都有一个哈希字段,但它们不匹配,因为您使用的是HashRouter

此外,如果您只想保留查询字符串,则只需在Redirect 中包含Location 对象中的search 字段和pathname

const RedirectComp: React.FC<any> = (props: any) => 
  const location = useLocation();
  return (
    <Redirect to= search: location.search, pathname: props.to  />
  );

【讨论】:

以上是关于使用 Redirect 组件的路径名时,React HashRouter 有两个哈希符号“#”的主要内容,如果未能解决你的问题,请参考以下文章

React路由

组件挂载上的 React hook Redirect

React Redirect with props 不会渲染最终组件

React redirect - react-router-dom 上的重定向组件

React Router Redirect - 将参数添加到路径名

react-router-dom之Redirect(重定向)理解