Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/reactjs/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Reactjs 保留部分路径的同时响应路由器声明性重定向_Reactjs_React Router - Fatal编程技术网

Reactjs 保留部分路径的同时响应路由器声明性重定向

Reactjs 保留部分路径的同时响应路由器声明性重定向,reactjs,react-router,Reactjs,React Router,我最近不得不在我的应用程序中更改一个路径,但我想通过重定向来保持旧深度链接的有效性。以下是更改路径的示例: 原件:/foo/users/12345 更新:/bar/users/12345 我尝试使用重定向来实现这一点: <Route path='/bar' component={MyComponent} /> <Route path='/foo'> <Redirect to='/bar' /> </Route> 但是,请求的后一部分在重定

我最近不得不在我的应用程序中更改一个路径,但我想通过重定向来保持旧深度链接的有效性。以下是更改路径的示例:

原件:
/foo/users/12345

更新:
/bar/users/12345

我尝试使用重定向来实现这一点:

<Route path='/bar' component={MyComponent} />
<Route path='/foo'>
  <Redirect to='/bar' />
</Route>

但是,请求的后一部分在重定向中丢失。因此,对
/foo/users/12345
的请求会重定向到
/bar


是否有一种声明性的方式在重定向中传递路径的
/users/12345
部分?

如果在
路径中放置正则表达式怎么办

<Route path='/(bar|foo)/' component={MyComponent} />


正如所回答的那样,我正在查看文档,没有找到您在问题中所解释的这个场景的现成解决方案

我没有尝试使用
重定向
,而是构建了一个功能组件,该组件已设置为原始路由的组件。这有助于重定向,并可用于此目的,如下所示:

<Route path='/foo/:users?/:id?' component={RedirectHelper}/>
<Route path='/bar/:users?/:id?' component={MyComponent}/>
因此,从技术上讲,
RedirectHelper
组件从原始
~foo/users/12345
URL的
history.location.pathname
属性中提取值,并构建新的URL。最后,它只是重定向到
~bar/users/12345
URL。原始版本的有效性已保留。我已经测试了这个解决方案,并且工作得很有魅力


希望这有帮助

我不明白你的问题。你能重新措辞吗?是否要更改url中的路径,但为不同的路径呈现特定组件?不,我基本上希望将
/foo*
重定向到
/bar*
,其中保留与splat匹配的部分。有趣的。。。这正是我所希望的。你能解释一下为什么我需要返回一个空div吗?我注意到,如果返回未定义,它将使新路径段加倍,并且无法正常工作。@djfdev
RedirectHelper
仍然是一个需要返回有效HTML或
null
的组件。这个解决方案只是一个让您的需求工作的变通方法。好的,让我更新到
null
,我更喜欢那个。我用
null
值做了额外的测试,同样有效。如果解决方案有效并回答了您的问题,请随意接受作为答案,谢谢。
const RedirectHelper = (props) => {
  const {history} = props;
  const path = history.location.pathname.replace('/foo', '');
  history.push(`/bar${path}`);
  return null;
}