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

Gia*_*Elk 100 reactjs react-router

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

Ada*_*own 76

对于react-router的版本1,2和3,将路由设置为URL映射方案的正确方法是将历史实现传递给history参数<Router>.从历史文件:

简而言之,历史记录知道如何监听浏览器的地址栏以进行更改,并将URL解析为路由器可用于匹配路由并呈现正确组件集的位置对象.

版本2和3

在react-router 2和3中,您的路由配置代码如下所示:

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

版本1

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

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

来源:2.0版升级指南

版本4

对于即将发布的react-router版本4,语法已经发生了很大变化,并且需要将其BrowserRouter用作路由器根标记.

import BrowserRouter from 'react-router/BrowserRouter'
ReactDOM.render (( 
  <BrowserRouter>
   ...
 <BrowserRouter> 
), document.body);
Run Code Online (Sandbox Code Playgroud)

反应路由器版本4文档

  • 请注意,`history`是您需要安装的[独立包](https://github.com/rackt/history). (6认同)
  • 他们改变了v2.x中的`browserHistory`:`react {browserHistory}来自'react-router'<Router history = {browserHistory} />`检查[react-router升级指南](https://github.com/rackt /react-router/blob/latest/upgrade-guides/v2.0.0.md#using-browser-html5-pushstate-history) (4认同)
  • @Matt它确实有效,但需要在服务器上提供支持.那是因为当你刷新时,你用一个带路径的URL命中服务器. (2认同)

pxw*_*ise 40

Router.run(routes, Router.HistoryLocation, function (Handler) {
  React.render(<Handler/>, document.body);
});
Run Code Online (Sandbox Code Playgroud)

对于当前版本0.11和转发,您需要添加Router.HistoryLocationRouter.run().<Routes>现已弃用.有关 0.12.x HistoryLocation实现,请参阅升级指南.

  • @Ninja可能会发布一个新问题,其中包含反应和反应路由器的确切版本号,收到的代码和错误. (2认同)

Sop*_*ert 21

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

具体操作方法取决于您使用的React Router的版本:

  • 您需要确保您的服务器端可以处理推送状态URL.在这种情况下,它可能意味着您只需要确保为您的应用程序提供服务的任何内容始终将它获取的每个URL发送到同一个根目录.所以`/ about`实际上会加载你的根页`/`.否则,您的服务器正在尝试查找与`/ about`匹配的路由,但什么也找不到(404).我个人并不使用python,但你通常会找到`/*`或`/.*` - >`/`的手动路由 - 或者你的服务器设置中可能是`html5Mode` url. (5认同)
  • IE9也不支持pushState - 所以这真的是"如果你不需要支持IE9"吧?我希望我错了. (3认同)

Gar*_*nte 9

您实际上可以使用.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
Run Code Online (Sandbox Code Playgroud)

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

然后,如果需要,您可以避免使用react路由,如果您愿意,也可以只操作URL和浏览器历史记录.希望这有助于某人......


Mox*_*Mox 5

安装历史记录包

npm install history --save
Run Code Online (Sandbox Code Playgroud)

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

import { createHistory, useBasename } from 'history';
...
const history = useBasename(createHistory)({
  basename: '/root' 
});
Run Code Online (Sandbox Code Playgroud)

如果你的应用网址是www.example.com/myApp,那么/ root应该是/ myApp.

将历史记录变量传递给路由器

render((
  <Router history={history}>
    ...
  </Router>
), document.getElementById('example'));
Run Code Online (Sandbox Code Playgroud)

现在,对于所有链接标记,在所有路径前面附加"/".

<Link to="/somewhere">somewhere</Link>
Run Code Online (Sandbox Code Playgroud)

该解决方案的灵感来自React-Router示例, 遗憾的是,它们的API中没有正确记录.