如何使用react-router在浏览器中停止/#/?

IT技术 reactjs react-router
2021-03-28 01:38:26

/#/使用 react-router 时,有什么方法可以防止在浏览器的地址栏中显示?这就是 ReactJS。即单击链接转到新路线显示localhost:3000/#/localhost:3000/#/about视路线而定。

6个回答

对于版本1,2和react,路由器3,设置URL映射方案的路线正确的方法是通过传递一个历史执行到history的参数<Router>历史文件

简而言之,历史记录知道如何监听浏览器地址栏的变化,并将 URL 解析为一个位置对象,路由器可以使用该对象来匹配路由并呈现正确的组件集。

版本 2 和 3

在 react-router 2 和 3 中,你的路由配置代码看起来像这样:

import { browserHistory } from 'react-router'
ReactDOM.render (( 
 <Router history={browserHistory} >
   ...
 </Router> 
), document.body);

版本 1

在 1.x 版中,您将改为使用以下内容:

import createBrowserHistory from 'history/lib/createBrowserHistory'
ReactDOM.render (( 
  <Router history={createBrowserHistory()} >
   ...
  </Router> 
), document.body);

来源:2.0 版升级指南

版本 4

对于即将到来的第 4 版 react-router,语法发生了很大变化,需要BrowserRouter用作路由器根标签。

import BrowserRouter from 'react-router/BrowserRouter'
ReactDOM.render (( 
  <BrowserRouter>
   ...
 <BrowserRouter> 
), document.body);

React Router 版本 4 文档

他们browserHistory在 v2.x 中更改了import { browserHistory } from 'react-router' <Router history={browserHistory} />检查react-router upgrade guide
2021-05-25 01:38:26
对于hashHistory,有没有办法在最后摆脱这个查询参数?http://localhost:8080/#/dashboard?_k=yqwtyu
2021-05-27 01:38:26
请注意,这history您需要安装的独立软件包
2021-05-31 01:38:26
谢谢@pistou,我将答案更新到 2.0 版!
2021-06-03 01:38:26
@Matt 它确实有效,但需要服务器支持。那是因为当您刷新时,您使用带有路径的 URL 访问服务器。
2021-06-09 01:38:26
Router.run(routes, Router.HistoryLocation, function (Handler) {
  React.render(<Handler/>, document.body);
});

对于当前版本 0.11 及更高版本,您需要添加Router.HistoryLocationRouter.run(). <Routes>现在已弃用。请参阅0.12.x HistoryLocation 实现的升级指南

这完全毁了我的应用程序。看起来他们目前的实现有问题?
2021-05-23 01:38:26
@Ninja 可能会发布一个新问题,其中包含 react 和 react-router 的确切版本号、失败的代码和收到的错误。
2021-05-23 01:38:26
@Chet 看起来 react-router 文档已经改组了。更新了在升级指南中找到的 HistoryLocation 唯一参考的链接。
2021-05-27 01:38:26

如果您不需要支持 IE8,您可以使用浏览器历史记录,而 react-router 将使用window.pushState而不是设置哈希值。

具体如何执行取决于您使用的 React Router 版本:

您需要确保您的服务器端可以处理推送状态 url。在这种情况下,这可能意味着您只需要确保为您的应用提供服务的任何内容始终将它到达的每个 url 发送到同一个根。这样/about实际上加载了您的根页面/否则,您的服务器正在尝试查找匹配/about但未找到任何内容的路由(404)。我个人不使用 python,但你通常会找到一个手动路由/*/.*->/工作 - 或者它可能是html5Mode你的服务器设置中称为url 的东西
2021-05-25 01:38:26
我添加了<Routes location="history">它一切正常,直到你在路由时刷新浏览器,localhost:3000/about然后我收到 404 错误。这是预期的python -m SimpleHTTPServer 3000,我正在使用
2021-06-16 01:38:26
该 github 链接是一个现在找不到的页面。
2021-06-16 01:38:26
谢谢@ben-alpert,我现在明白了。
2021-06-17 01:38:26
IE9 也不支持 pushState —— 所以这真的是“如果你不需要支持 IE9”,对吗?我希望我错了。
2021-06-21 01:38:26

您实际上可以使用 .htaccess 来完成此操作。浏览器通常需要查询字符串分隔符?#确定查询字符串的开始位置和目录路径的结束位置。我们想要的最终结果是www.mysite.com/dir 所以我们需要在 Web 服务器搜索它认为我们要求的目录之前发现问题/dir所以我们.htaccess在项目的根目录下放置一个文件。

    # Setting up apache options
    AddDefaultCharset utf-8
    Options +FollowSymlinks -MultiViews -Indexes
    RewriteEngine on

    # Setting up apache options (Godaddy specific)
    #DirectoryIndex index.php
    #RewriteBase /


    # Defining the rewrite rules
    RewriteCond %{SCRIPT_FILENAME} !-d
    RewriteCond %{SCRIPT_FILENAME} !-f

    RewriteRule ^.*$ ./index.html

然后使用 window.location.pathname 获取查询参数

然后,您可以根据需要避免使用react路由,如果需要也可以操作 url 和浏览器历史记录。希望这可以帮助某人...

Jboss 的等价物是什么?
2021-06-02 01:38:26

安装历史包

npm install history --save

接下来从历史中导入 createHistory 和 useBasename

import { createHistory, useBasename } from 'history';
...
const history = useBasename(createHistory)({
  basename: '/root' 
});

如果您的应用程序 url 是 www.example.com/myApp,则 /root 应该是 /myApp。

将历史变量传递给路由器

render((
  <Router history={history}>
    ...
  </Router>
), document.getElementById('example'));

现在,对于所有链接标签,在所有路径前附加一个“/”。

<Link to="/somewhere">somewhere</Link>

该解决方案的灵感来自React-Router Example, 不幸的是,在他们的 API 中没有正确记录。

是的,再多读几遍,一切就明白了。我最终使用了没有键的 hashHistory。
2021-05-24 01:38:26
这需要节点服务器吗?我试图实现相同的 URL 样式,但只能通过客户端。是否可以?
2021-05-25 01:38:26
如果您没有找到,则由服务器返回。这意味着 url 模式不是反应路由器的一部分。
2021-05-27 01:38:26
不,您不需要节点服务器。事实上,我在 Django 后端运行。但是您可能需要 node 来获取工具。
2021-06-04 01:38:26
好的,我尝试了这种方法。当我按 F5 时,我得到的只是“未找到”。这段历史有可能处理那个吗?
2021-06-06 01:38:26