【发布时间】:2016-01-02 02:26:09
【问题描述】:
我目前正在使用 Express 在 React.js 和 react-router 中加载单页客户端应用程序。
它的结构使得我将 /about 和 /contact 作为标准的翡翠视图,但 /ui 作为实际的反应应用程序。 /ui 之外的任何后续导航(例如 ui/dashboard)都由 react-router 处理。这意味着,如果我需要访问 www.foobar.com/ui/dashboard,我需要点击 ui* 的路由,获取 ui/ 之后的 url(在本例中为仪表板)并将其传递给 react 路由器(通过变量在作为反应应用程序入口点的翡翠视图中),然后从反应组件加载此路由。我想让这种方法发挥作用,因为这使用户能够为 react 应用程序保存 url。麻烦的是我无法弄清楚这如何工作:
- 我无法通过快速路由器重定向传递变量
- 我需要加载 react 应用程序,而不需要除 /ui 之外的任何内容,否则 react 路由器会将其路由 URL 附加在它前面,从而破坏这种方法的要点
- 我无法将初始请求 url 存储在 cookie 中然后重定向,因为我需要发送响应以设置 cookie
- 我无法通过客户端 js 满意地修改 url
代码:
//Example 1
router.get('/ui*', requireLogin, function(req, res){
res.render('./app/index', {initURL: req.path); //Doesnt work as everything past ui/ is still present when react-router does its thing
});
//Example 2
router.get('/ui', requireLogin, function(req, res){
res.render('./app/index', {initURL: req.path); //Doesnt work as no way of accessing the initial requests url when redirecting
});
router.get('/ui*', requireLogin, function(req, res){
res.redirect('/ui'); //Cant pass additional parameters here
});
【问题讨论】:
-
第一个例子似乎最合理。而且我真的不明白评论“当 react-router 做它的事情时,所有超过 ui/ 的东西仍然存在” - 这不正是你想要的吗?如果没有 - 然后尝试在反应路由器“做这件事”之前使用
History.replaceState。虽然,将路径作为变量传递似乎很疯狂,将其从地址栏中删除,然后重新添加。 -
@David 我能够使用 npm 的历史模块和 History.replaceState 解决问题,干杯!我之前使用不正确,并且由于没有更改 react-router 的默认路由系统而让自己感到困惑,所以我在我的 url 的末尾得到了 #/?_k=mc0v9g 这没有帮助。为我指明正确的方向而欢呼。
标签: javascript cookies express reactjs react-router