react 路由 react-router@3.2.1
react路由,4.x的差异还是比较大,暂时还是3.x的版本
安装:
npm install -S react-router@3.x
配置:
import { Router, Route, hashHistory } from 'react-router';
<Router history={hashHistory}>{/*browserHistory、hashHistory、createMemoryHistory*/}
    <Route exact path="/" component={App}> {/*exact 表示精确匹配*/}
        <IndexRoute component={Home}/>{/*显式指定Home是根路由的子组件,即指定默认情况下加载的子组件。*/}
        <IndexRedirect to="/welcome" />{/*IndexRedirect组件用于访问根路由的时候,将用户重定向到某个子组件。*/}
        <Route path="welcome" component={Welcome} />
        <Route path="/repos" component={Repos}/>
        <Route path="/about/(:id)" component={About}/>
        <Route path="inbox" component={Inbox}>
          {/*<Redirect>组件用于路由的跳转,即用户访问一个路由,会自动跳转到另一个路由。*/}
          {/* 从 /inbox/messages/:id 跳转到 /messages/:id */}
          {/* :id 获取-> this.props.params.id*/}
          <Redirect from="messages/:id" to="/messages/:id" />
        </Route>
    </Route>
   <Route path="*" component={Page404}></Route>
</Router>
app组件:
export default React.createClass({
 let baseUrl = this.props.match.url;{/*获得当前路由,即 / ,对于页面可维护性是十分重要的*/}
  render() {
    return (
        <div>
            <ul role="nav">
              <IndexLink to="/" activeClassName="active">Home</IndexLink>{/*默认页*/}
              <li><Link to=`/${baseUrl}/about` activeStyle={{color: 'red'}}>About</Link></li>
              <li><Link to="/repos" activeClassName="active">Repos</Link></li>
         <li><Link to={{ pathname: '/hello', query: { name: 'ryan' } }}> Hello </Link></li>
         <li><Link to={`/my/${myId}/info`}>点击</Link></li>
         <li><Link to={{pathname:"/select", hash:'#ahash', query:{foo: 'bar', boo:'boz'}, state:{data:'miao'}  }} activeClassName="GlobalNav-active">精选</Link></li>
            </ul>
            <div>
              {this.props.children} {/*this.props.children属性就是子组件*/}
            </div>
        </div>
    )
  }
})
path属性:
<Route path="/hello/:name">
// 匹配 /hello/michael
// 匹配 /hello/ryan <Route path="/hello(/:name)">
// 匹配 /hello
// 匹配 /hello/michael
// 匹配 /hello/ryan <Route path="/files/*.*">
// 匹配 /files/hello.jpg
// 匹配 /files/hello.html <Route path="/files/*">
// 匹配 /files/
// 匹配 /files/a
// 匹配 /files/a/b <Route path="/**/*.jpg">
// 匹配 /files/hello.jpg
// 匹配 /files/path/to/file.jpg
path属性也可以使用相对路径(不以/开头),匹配时就会相对于父组件的路径。路由匹配规则是从上到下执行,一旦发现匹配,就不再其余的规则了。
编程式导航:
hashHistory
import { hashHistory } from 'React-router'
... ...
hashHistory.push('mine')
//传参
hashHistory.push({
    pathname: 'good/details/'+this.state.id,//与路由表中配置相对应,
        query: {
            title:value.title,
            name:value.name
        },
    })      
... ...
接收参数:
this.props.params.id this.props.location.query.title
this.props.location.query.name
此外:
browserHistory
import { browserHistory } from 'react-router';
... ...
browserHistory.push('/some/path');
context对象
class Example extends React.Component {
    constructor(props, context) {
        super(props, context);
        this.context.router; // it works
    }
    ... ...
    handleSubmit(event) {
        this.context.router.push(path)
    },
}
//必须显示声明
Example.contextTypes = {
    router:  React.PropsTypes.object
}
路由钩子:
onEnter与onLeave
onEnter钩子替代<Redirect>组件。
<Route path="inbox" component={Inbox}>
  <Route
    path="messages/:id"
    onEnter={
      ({params}, replace) => replace(`/messages/${params.id}`)
    }
  />
</Route>
onEnter钩子还可以用来做认证。
const requireAuth = (nextState, replace) => {
    if (!auth.isAdmin()) {
        // Redirect to Home page if not an Admin
        replace({ pathname: '/' })
    }
}
export const AdminRoutes = () => {
  return (
     <Route path="/admin" component={Admin} onEnter={requireAuth} />
  )
}
当用户离开一个路径的时候,跳出一个提示框,要求用户确认是否离开。
const Home = withRouter(
React.createClass({
componentDidMount() {
this.props.router.setRouteLeaveHook(
this.props.route,
this.routerWillLeave
)
}, routerWillLeave(nextLocation) {
// 返回 false 会继续停留当前页面,
// 否则,返回一个字符串,会显示给用户,让其自己决定
if (!this.state.isSaved)
return '确认要离开?';
},
})
)
上面代码中,setRouteLeaveHook方法为Leave钩子指定routerWillLeave函数。该方法如果返回false,将阻止路由的切换,否则就返回一个字符串,提示用户决定是否要切换。
react 路由 react-router@3.2.1的更多相关文章
- react第十四单元(react路由-react路由的跳转以及路由信息)
		
第十四单元(react路由-react路由的跳转以及路由信息) #课程目标 理解前端单页面应用与多页面应用的优缺点 理解react路由是前端单页面应用的核心 会使用react路由配置前端单页面应用框架 ...
 - react第十三单元(react路由-react路由的跳转以及路由信息) #课程目标
		
第十三单元(react路由-react路由的跳转以及路由信息) #课程目标 熟悉掌握路由的配置 熟悉掌握跳转路由的方式 熟悉掌握路由跳转传参的方式 可以根据对其的理解封装一个类似Vue的router- ...
 - 【React  8/100】 React路由
		
React路由 React路由介绍 现代的前端应用大多数是SPA(单页应用程序),也就是只有一个HTML页面的应用程序.因为它的用户体验更好.对服务器压力更小,所以更受欢迎.为了有效的使用单个页面来管 ...
 - react路由配置(未完)
		
React路由 React推了两个版本 一个是react-router 一个是react-router-dom 个人建议使用第二个 因为他多了一个Link组件 Npm install react-ro ...
 - react router @4 和 vue路由 详解(七)react路由守卫
		
完整版:https://www.cnblogs.com/yangyangxxb/p/10066650.html 12.react路由守卫? a.在之前的版本中,React Router 也提供了类似的 ...
 - 【react router路由】<Router> <Siwtch> <Route>标签
		
博客 https://www.jianshu.com/p/ed5e56994f13?from=timeline 文档 http://react-guide.github.io/react-router ...
 - react路由案例(非常适合入门)
		
前面已经已经讲过一次路由 稍微有些复杂 考虑到有些同学刚接触到 我准备了一个简单的demo 就当自己也顺便复习一下 data.js const data = [ { name: 'Ta ...
 - react路由深度解析
		
先看一段代码能否秒懂很重要 这是app.js 全局js的入口 import React from 'react' import { render } from 'react-dom' import ...
 - react路由的安装及格式和使用方法
		
react路由的安装: 在要创建项目的目录命令窗里输入: cnpm install -g create-react-app create-react-app 项目名 在创建好的项目目录命令窗里输入: ...
 - react 路由导航栏 withRouter
		
codesandbox https://codesandbox.io/s/9l6prnyxjy app.js import React, { Component, Fragment } from &q ...
 
随机推荐
- List去重复数据
			
for ( int i = 0 ; i < list.size() - 1 ; i ++ ) { for ( int j = list.size() - 1 ; j > i; j -- ...
 - 基于jquery的自定义显示消息数量
			
根据需求简单的实现一个小功能控件,暂时不支持扩展 $("xxxxxxx").iconCountPlugin(options, start, isOffset) {//三个参数,自定 ...
 - Gameia
			
F - Gameia HDU - 6105 Alice and Bob are playing a game called 'Gameia ? Gameia !'. The game goes l ...
 - 提高CPU使用率
			
某些特殊时候,需要提升下cpu的利用率,此时……………………需要一个极其简单的脚本来完成! #!/bin/bash while (true);do { for i in $(seq 100000 10 ...
 - (12) OpenSSL主配置文件openssl.cnf
			
1.man config 该帮助文档说明了openssl.cnf以及一些其他辅助配置文件的规范.格式及读取方式.后文中的所有解释除非特别指明,都将以openssl.cnf为例. [root@local ...
 - js实现复制粘贴功能
			
在项目中使用到复制粘贴功能,虽然网上有很多大牛封装了很多的插件,但是还是想不去使用插件,就像自己来实现这个功能. 另一篇是禁止复制粘贴 前端er怎样操作剪切复制以及禁止复制+破解等 初步想法: 1. ...
 - c++_核桃的数量
			
#include <iostream> using namespace std; int gcd(int x,int y){ int temp; ){ temp=x%y; x=y; y=t ...
 - 第五讲:Fast RTL-level verification
			
1.good code styles 2.+rad compile time switch for compile 1.了解VCS 的架构 <===这方便了解不多 parser / even ...
 - maven添加本地jar包到本地仓库
			
1 进入jar包所在文件夹,进入cmd命令 2 执行命令 mvn install:install-file -Dfile=ojdbc6.jar -DgroupId=com.oracle -Dartif ...
 - 有关OEP脱壳
			
首先补充: OEP:(Original Entry Point),程序的入口点,软件加壳就是隐藏了OEP(或者用了假的OEP), 只要我们找到程序真正的OEP,就可以立刻脱壳. PUSHAD (压栈) ...