React Router v4 重定向不起作用
React Router v4 Redirect not working
我有一个路由在检查了这样的条件后重定向
<Route exact path="/" render={()=>(
Store.isFirstTime ? <Redirect to="intro" /> : <Home state={Store}/>)}/>
当条件为真但组件未安装时,url 发生变化。其余组件代码如下
render() {
return (
<div>
...
<Route exact path="/" render={()=>(
Store.isFirstTime ? <Redirect to="intro" /> : <Home state={Store} />
)} />
<Route path="/intro" render={()=>(<IntroWizard state={Store.userInfo}/>)} />
<Route path="/home" render={()=>(<Home state={Store}/>)} />
<Route render={()=>(<h1>404 Not Found</h1>)} />
<Footer />
</div>
);
}
我的应用程序组件包含在 BrowserRouter 中,就像 thi
ReactDOM.render(<BrowserRouter>
<App/>
</BrowserRouter>,
document.getElementById('root')
);
当我在浏览器中直接点击 url 时 'localhost:3000/intro' 组件已成功安装,但是当它通过重定向时它不显示该组件。我该如何解决?
编辑
所以缺少一个细节,我尝试创建另一个项目来重现该问题。
我的 App 组件是来自 mobx-react 的观察者,它导出如下所示
let App = observer(class App { ... })
export default App
我已经用示例代码创建了这个 repo 来重现你可以使用它的问题
https://github.com/mdanishs/mobxtest/
所以当组件被包装到 mobx-react observer 中时,重定向不起作用,否则它工作正常
你在简介前面少了一个 /
<Route exact path="/" render={()=>(
Store.isFirstTime ? <Redirect to="/intro" /> : <Home state={Store} />
)} />
提问者发布了一个 issue on GitHub, and got this apparently unpublished hidden guide (edit: now published) 也帮助了我。我将其张贴在这里是因为我 运行 遇到了同样的问题并希望其他人避免我们的痛苦。
问题是 mobx-react 和 react-redux 都提供了它们自己的 shouldComponentUpdate()
函数,这些函数只检查 prop 的变化,但 react-router 通过上下文发送状态。当位置发生变化时,它不会改变任何道具,因此不会触发更新。
解决这个问题的方法是将位置作为道具传递下去。上面的指南列出了几种方法,但最简单的方法是用 withRouter()
高阶组件包装容器:
export default withRouter(observer(MyComponent))
或者,对于 redux:
export default withRouter(connect(mapStateToProps)(MyComponent))
将 Router 与其他组件(如翻译提供程序、主题提供程序等)组合在一起时要小心。一段时间后,我发现你的 App 必须由 Router 严格包装,如下所示:
<Provider store={store}>
<ThemeProvider theme={theme}>
<TranslationProvider
namespaces={['Common', 'Rental']}
translations={translations}
defaultNS={'Common'}
>
<Router>
<App />
</Router>
</TranslationProvider>
</ThemeProvider>
</Provider>
希望这对某人有所帮助
您应该只在渲染方法中渲染 Redirect
:
render() {
return (<Redirect to="/" />);
}
但这是我最喜欢的不使用 Redirect
组件的解决方案
- 进口
import { withRouter } from 'react-router-dom';
export default withRouter(MyComponent);
- 最后,在您的操作方法中,假设
handlingButtonClick
handlingButtonClick = () => {
this.props.history.push("/") //doing redirect here.
}
<Redirect />
不应在 <Switch></Switch>
标签内。
你可以这样试试:
首先:像这样将 "withRouter" 导入组件:
import { withRouter } from "react-router-dom";
然后在组件的末尾像这样导出组件:
export default withRouter(VerifyCode);
然后您可以将此代码添加到您的函数中:
verify(e) {
// after sever get 200
this.props.history.push('/me/');
}
祝你好运
const App = ({history}) =>{
return history.push('/location') }
Add "exact" in order to redirect
示例:
<Switch>
<Route exact path="/">
<Redirect to="/home" />
</Route>
<Switch>
我用 ReactJS 重定向研究了 3 个小时,这里是最好的重定向方法,我创建了一个这样的模块:
import { useHistory, withRouter } from "react-router-dom";
const Redirect = (props: any) => {
const to = (props.to || '/');
let history = useHistory();
history.push(to);
window.location.reload();
return (
<>
</>
)
}
export default withRouter(Redirect);
而且效果很好!
您可以在其他文件中使用!
像这样:
export default function RedirectExample() {
return (
<Router>
<Switch>
<Route path="/page/2">
<QueryPage />
</Route>
<Route path="/page">
<MyRedirect to="/" />
</Route>
</Switch>
</Router>
);
}
我有一个路由在检查了这样的条件后重定向
<Route exact path="/" render={()=>(
Store.isFirstTime ? <Redirect to="intro" /> : <Home state={Store}/>)}/>
当条件为真但组件未安装时,url 发生变化。其余组件代码如下
render() {
return (
<div>
...
<Route exact path="/" render={()=>(
Store.isFirstTime ? <Redirect to="intro" /> : <Home state={Store} />
)} />
<Route path="/intro" render={()=>(<IntroWizard state={Store.userInfo}/>)} />
<Route path="/home" render={()=>(<Home state={Store}/>)} />
<Route render={()=>(<h1>404 Not Found</h1>)} />
<Footer />
</div>
);
}
我的应用程序组件包含在 BrowserRouter 中,就像 thi
ReactDOM.render(<BrowserRouter>
<App/>
</BrowserRouter>,
document.getElementById('root')
);
当我在浏览器中直接点击 url 时 'localhost:3000/intro' 组件已成功安装,但是当它通过重定向时它不显示该组件。我该如何解决?
编辑
所以缺少一个细节,我尝试创建另一个项目来重现该问题。 我的 App 组件是来自 mobx-react 的观察者,它导出如下所示
let App = observer(class App { ... })
export default App
我已经用示例代码创建了这个 repo 来重现你可以使用它的问题 https://github.com/mdanishs/mobxtest/
所以当组件被包装到 mobx-react observer 中时,重定向不起作用,否则它工作正常
你在简介前面少了一个 /
<Route exact path="/" render={()=>(
Store.isFirstTime ? <Redirect to="/intro" /> : <Home state={Store} />
)} />
提问者发布了一个 issue on GitHub, and got this apparently unpublished hidden guide (edit: now published) 也帮助了我。我将其张贴在这里是因为我 运行 遇到了同样的问题并希望其他人避免我们的痛苦。
问题是 mobx-react 和 react-redux 都提供了它们自己的 shouldComponentUpdate()
函数,这些函数只检查 prop 的变化,但 react-router 通过上下文发送状态。当位置发生变化时,它不会改变任何道具,因此不会触发更新。
解决这个问题的方法是将位置作为道具传递下去。上面的指南列出了几种方法,但最简单的方法是用 withRouter()
高阶组件包装容器:
export default withRouter(observer(MyComponent))
或者,对于 redux:
export default withRouter(connect(mapStateToProps)(MyComponent))
将 Router 与其他组件(如翻译提供程序、主题提供程序等)组合在一起时要小心。一段时间后,我发现你的 App 必须由 Router 严格包装,如下所示:
<Provider store={store}>
<ThemeProvider theme={theme}>
<TranslationProvider
namespaces={['Common', 'Rental']}
translations={translations}
defaultNS={'Common'}
>
<Router>
<App />
</Router>
</TranslationProvider>
</ThemeProvider>
</Provider>
希望这对某人有所帮助
您应该只在渲染方法中渲染 Redirect
:
render() {
return (<Redirect to="/" />);
}
但这是我最喜欢的不使用 Redirect
组件的解决方案
- 进口
import { withRouter } from 'react-router-dom';
export default withRouter(MyComponent);
- 最后,在您的操作方法中,假设
handlingButtonClick
handlingButtonClick = () => {
this.props.history.push("/") //doing redirect here.
}
<Redirect />
不应在 <Switch></Switch>
标签内。
你可以这样试试:
首先:像这样将 "withRouter" 导入组件:
import { withRouter } from "react-router-dom";
然后在组件的末尾像这样导出组件:
export default withRouter(VerifyCode);
然后您可以将此代码添加到您的函数中:
verify(e) {
// after sever get 200
this.props.history.push('/me/');
}
祝你好运
const App = ({history}) =>{
return history.push('/location') }
Add "exact" in order to redirect
示例:
<Switch>
<Route exact path="/">
<Redirect to="/home" />
</Route>
<Switch>
我用 ReactJS 重定向研究了 3 个小时,这里是最好的重定向方法,我创建了一个这样的模块:
import { useHistory, withRouter } from "react-router-dom";
const Redirect = (props: any) => {
const to = (props.to || '/');
let history = useHistory();
history.push(to);
window.location.reload();
return (
<>
</>
)
}
export default withRouter(Redirect);
而且效果很好! 您可以在其他文件中使用! 像这样:
export default function RedirectExample() {
return (
<Router>
<Switch>
<Route path="/page/2">
<QueryPage />
</Route>
<Route path="/page">
<MyRedirect to="/" />
</Route>
</Switch>
</Router>
);
}