前端工程采用 SPA 模式 hashHistory , 在集成到生产环境中的时候,使用browserHistory :

var his;
if (isDev) {//SPAhis = hashHistory
} else {his = browserHistory
}let routes =<Route path="/"><IndexRedirect to="index"/><Route path="index" component={PageHome}/><Route path="article_list" component={PageArticleList}/><Route path="category_list" component={PageCategoryList}/><Route path="tag_list" component={PageTagList}/></Route>let router = <Router routes={routes} history={his}/>
ReactDOM.render(router, document.getElementById('App'))

Histories

需要依赖: ReactRouter.min.js

Histories

React Router 是建立在 history 之上的。
简而言之,一个 history 知道如何去监听浏览器地址栏的变化,
并解析这个 URL 转化为 location 对象,
然后 router 使用它匹配到路由,最后正确地渲染对应的组件。

常用的 history 有三种形式,
但是你也可以使用 React Router 实现自定义的 history。

  • browserHistory
  • hashHistory
  • createMemoryHistory

你可以从 React Router 中引入它们:

// JavaScript 模块导入(译者注:ES6 形式)
import { browserHistory } from 'react-router'

然后将它们传递给<Router>:

render(<Router history={browserHistory} routes={routes} />,document.getElementById('app')
)

browserHistory

Browser history 是使用 React Router 的应用推荐的 history。它使用浏览器中的 History API 用于处理 URL,创建一个像example.com/some/path这样真实的 URL 。

服务器配置

服务器需要做好处理 URL 的准备。处理应用启动最初的 / 这样的请求应该没问题,但当用户来回跳转并在 /accounts/123 刷新时,服务器就会收到来自 /accounts/123 的请求,这时你需要处理这个 URL 并在响应中包含 JavaScript 应用代码。

一个 express 的应用可能看起来像这样的:

const express = require('express')
const path = require('path')
const port = process.env.PORT || 8080
const app = express()// 通常用于加载静态资源
app.use(express.static(__dirname + '/public'))// 在你应用 JavaScript 文件中包含了一个 script 标签
// 的 index.html 中处理任何一个 route
app.get('*', function (request, response){response.sendFile(path.resolve(__dirname, 'public', 'index.html'))
})app.listen(port)
console.log("server started on port " + port)

如果你的服务器是 nginx,请使用 try_files 指令:

server {...location / {try_files $uri /index.html}
}

当在服务器上找不到其他文件时,这可以让 nginx 服务器提供静态文件服务并指向index.html 文件。

对于Apache服务器也有类似的方式,创建一个.htaccess文件在你的文件根目录下:

RewriteBase /
RewriteRule ^index\.html$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.html [L]

IE8, IE9 支持情况

如果我们能使用浏览器自带的 window.history API,那么我们的特性就可以被浏览器所检测到。如果不能,那么任何调用跳转的应用就会导致 全页面刷新,它允许在构建应用和更新浏览器时会有一个更好的用户体验,但仍然支持的是旧版的。

你可能会想为什么我们不后退到 hash history,问题是这些 URL 是不确定的。如果一个访客在 hash history 和 browser history 上共享一个 URL,然后他们也共享同一个后退功能,最后我们会以产生笛卡尔积数量级的、无限多的 URL 而崩溃。

hashHistory

Hash history 使用 URL 中的 hash(#)部分去创建形如 example.com/#/some/path 的路由。

我应该使用 createHashHistory吗?

Hash history 不需要服务器任何配置就可以运行,如果你刚刚入门,那就使用它吧。但是我们不推荐在实际线上环境中用到它,因为每一个 web 应用都应该渴望使用 browserHistory

像这样 ?_k=ckuvup 没用的在 URL 中是什么?

当一个 history 通过应用程序的 pushreplace 跳转时,它可以在新的 location 中存储 “location state” 而不显示在 URL 中,这就像是在一个 HTML 中 post 的表单数据。

在 DOM API 中,这些 hash history 通过 window.location.hash = newHash 很简单地被用于跳转,且不用存储它们的location state。但我们想全部的 history 都能够使用location state,因此我们要为每一个 location 创建一个唯一的 key,并把它们的状态存储在 session storage 中。当访客点击“后退”和“前进”时,我们就会有一个机制去恢复这些 location state。

createMemoryHistory

Memory history 不会在地址栏被操作或读取。这就解释了我们是如何实现服务器渲染的。同时它也非常适合测试和其他的渲染环境(像 React Native )。

和另外两种history的一点不同是你必须创建它,这种方式便于测试。

const history = createMemoryHistory(location)

实现示例

import React from 'react'
import { render } from 'react-dom'
import { browserHistory, Router, Route, IndexRoute } from 'react-router'import App from '../components/App'
import Home from '../components/Home'
import About from '../components/About'
import Features from '../components/Features'render(<Router history={browserHistory}><Route path='/' component={App}><IndexRoute component={Home} /><Route path='about' component={About} /><Route path='features' component={Features} /></Route></Router>,document.getElementById('app')
)

React Router 之 browserHistory相关推荐

  1. 使用React Router以编程方式导航

    通过react-router我可以使用Link元素来创建由react路由器本地处理的链接. 我在内部看到它调用this.context.transitionTo(...) . 我想从下拉列表中进行导航 ...

  2. 从 React Router 谈谈路由的那些事

    React Router 是专为 React 设计的路由解决方案,在使用 React 来开发 SPA (单页应用)项目时,都会需要路由功能,而 React Router 应该是目前使用率最高的. Re ...

  3. React Router 黑笔记?

    我横竖睡不着,字里行间看出2个字.... 首先,在该项目开始之前,还请大家能够先下载一个项目脚手架.本教程基于该脚手架进行开发 先看文件大致架构 渲染 Route (index.js 启动的compo ...

  4. React Router 使用教程

    真正学会 React 是一个漫长的过程. 你会发现,它不是一个库,也不是一个框架,而是一个庞大的体系.想要发挥它的威力,整个技术栈都要配合它改造.你要学习一整套解决方案,从后端到前端,都是全新的做法. ...

  5. React Router入门指南

    by Nader Dabit 纳德·达比特(Nader Dabit) React Router入门指南 (Beginner's Guide to React Router) Or what I wis ...

  6. React Router学习

    React Router教程 本教程引用马伦老师的的教程 React项目的可用的路由库是React-Router,当然这也是官方支持的.它也分为: react-router 核心组件 react-ro ...

  7. React路由管理 —— React Router 总结

    React项目通常都有很多的URL需要管理,最常使用的解决方案就是React Router了,最近学习了一下,主要是看了一下官方的英文文档,加以总结,以备后查. React Router是做什么的呢, ...

  8. 阮一峰 React Router 教程

    阮一峰 React Router 教程 本文介绍 React 体系的一个重要部分:路由库 React-Router.它是官方维护的,事实上也是唯一可选的路由库.它通过管理 URL,实现组件的切换和状态 ...

  9. React Router 中文文档(一)

    React Router 中文文档(一) React Router 中文文档(一) 官方英文文档 - https://reacttraining.com/rea... 版本 - v4.2.0 < ...

最新文章

  1. 网络请求方式Fetch简介
  2. linux下程序执行的步骤及其作用
  3. 终于要揭开神秘面纱?Magic Leap将要展示产品
  4. 系统目录结构文件类型及ls.alias命令
  5. 提莫隐身+机器人能钩_航空工业官宣全新歼20正式亮相,可以隐身的变形金刚
  6. https://www.threatminer.org/domain.php?q=blackschickens.xyz ——域名的信誉查询站点 还可以查IP...
  7. python的设计模式之MVC模式
  8. sql输出带颜色的字段_带你走进MySQL数据库(MySQL入门详细总结一)
  9. bo耳机h5使用说明_真香时刻·性价比大旗——红米AirDots2 TWS真无线耳机体验测评...
  10. ip 地址 192.168.1.255 代表( )。_如何批量ping大量ip地址?一个软件搞定
  11. Tarjan边的双联通
  12. poj_2286 线段树
  13. 苹果 Mac 上不显示外置硬盘?9 个必须尝试的修复方法
  14. 怎样用代码方式退出IOS程序
  15. iphone4电信版怎么写号_电信iphone4如何剪卡以及写号
  16. 计算机u盘被禁用怎么办,电脑U盘启动被禁用了怎么解决 电脑禁用u盘怎样恢复...
  17. 全国计算机四级薪资,全国计算机四级通过率有多少
  18. SCCM 2012 R2部署,安装SCCM(四)
  19. 短信验证码登录的实现
  20. 基于扰动观测器的直流电机调速系统,(售出不退慎拍!) 有计算公式,仿真模型

热门文章

  1. 搭建腾讯云服务器(详细+最新教程)
  2. 海康大华相机rtsp
  3. 小球自由落体后反弹,计算路线和反弹高度
  4. mysql 定时备份数据库
  5. Mac 使用 mysqlclient 报错 NameError: name ‘_mysql‘ is not defined
  6. 无血清培养基的优缺点概述
  7. 【特效】3D旋转相册
  8. mysql还原数据表的语句_MYSQL数据库常用备份及恢复语句
  9. 面试题之银行业务系统
  10. HP新数据中心成为绿色技术实验室