【发布时间】:2018-04-21 17:17:16
【问题描述】:
短版:当用户点击一个按钮时,我想做一些事情,然后重新路由用户。我该怎么做?
加长版:
我有嵌套路由(不知道这是否对手头的问题有任何影响)这是如何设置的>
我想要一个按钮,它首先做某事,然后重新路由用户,因此我不能使用Link。首先我看到的是
为此使用
this.props.history.push('/route')
但后来我了解到this.props.history 不再是一个东西,现在它是自己的 npm 包。 Here我得到了一个关于如何实现我需要的简单解释。
我的问题示例:
App.js 渲染:
<Router history={history}>
<div>
<Link to="/">
<button>Go to home</button>
</Link>
<Switch>
<Route exact path="/other" component={() => <Other/>} />
<Route path="/" component={() => <Home/>} />
</Switch>
</div>
</Router>
有两个顶级路由,/other 的确切路径呈现 Other,如下所示:
以及呈现Home 的/ 的相对路径,如下所示:
Home 呈现这段代码:
<div>
THIS IS HOME WOO!
<div>
<Route exact path="/" component={() => <HomeController/>} />
<Route exact path="/about" component={() => <About/>} />
<Route exact path="/click-page" component={() => <ClickPage/>} />
</div>
</div>
现在这里默认是HomeController(包含两个按钮,链接指向about和click-page),但/about呈现About,看起来像这样:
而/click-page 渲染ClickPage 看起来像这样:
这是问题开始的地方:(
所以ClickPage 呈现这个:
<button onClick={clickHandler}>
DO SOMETHING THEN GO TO ABOUT
</button>
clickHandler 看起来像这样:
function clickHandler(){
console.log("doing stuff");
history.push('/about');
}
history 在这种情况下是从另一个看起来像这样的文件导入的:
// history.js
import { createBrowserHistory } from 'history'
export default createBrowserHistory({
/* pass a configuration object here if needed */
})
这是从我前面提到的answer逐个字符复制而来的。
问题是,当我点击按钮时,我看到的是这样的:
所以函数被调用,它做了一些事情,然后将“/about”推送到历史记录,但什么也没发生。为什么是这样?我需要强制Home 重新渲染吗?
我用来重新创建问题的完整示例代码在这里:pastebin-link
【问题讨论】:
-
你能做一个 Codesandbox 的例子,我看一下吗?
-
当然!非常感谢!这是副本的链接:codesandbox.io/s/61pm121vkw
-
@MrJalapeno 这种行为是你想要的吗? codesandbox.io/s/w21m5mlvyw