React 教程第十篇 —— 路由(3.0)
路由通过 URL 映射到对应的功能实现,React 的路由使用要先引入 react-router.js。 路由背景-SPA传统的前端基本都是通过页面之间跳转来实现各功能模块的切换,这种做法会导致一个项目下来存在大量的 html 页面,而且每个页面都有一大堆的静态资源文件需要引入,在性能一直被垢病。后来有了随着 ajax 的普及,还有 jQuery 对 ajax 的封装后的便捷使用,开发者会大量的使用 ajax 来加载一个 html 页面到当前页面的某个容器当中来实现无刷新加载,但依然没有解决大量存在 html 页面和每个页面加载大量的静态资源文件而导致性能上的问题。随着移动互联网的普及,移动端对页面加载的性能要求和流量的限制越来越高,所以主流的前端框架都往 SPA 方向靠齐。 路由引用与使用//es5 var {Router,Route,hashHistory,Link,IndexRoute,browserHistory} = require("react-router"); //es6 import {Router,browserHistory} from 'react-router'; //es5 和 es6 的使用都是一样的 <Link to="/">Root</Link> <Router> <Route path='/' component={RootComponent}/> </Router> //使用 `<script>` 标签 <script src="../js/ReactRouter.js"></script> <ReactRouter.Link to="/">Root</ReactRouter.Link> <ReactRouter.Router> <ReactRouter.Route path='/' component={RootComponent}/> </ReactRouter.Router> 路由组件与属性Link
Router
Route 组件的属性
基本用法import React from 'react' import ReactDOM from 'react-dom' import {Router,browserHistory} from 'react-router' const html = ( <ul> <li><Link to="/">Root</Link></li> <li><Link to="/page">page</Link></li> </ul> ) class RootComponent extends React.Component{ render(){ return ( <div> <h1>RootComponent</h1> {html} </div> ) } } class PageComponent extends React.Component{ render(){ return ( <div> <h1>PageComponent</h1> {html} </div> ) } } ReactDOM.render( <Router history={hashHistory}> <Route path='/' component={RootComponent}/> <Route path='/page' component={PageComponent}/> </Router>,document.getElementById('app') ) 效果预览 路由参数
import React from 'react' import ReactDOM from 'react-dom' import {Router,browserHistory} from 'react-router' class UserComponent extends React.Component{ render(){ return ( <div> <h3>UserComponent 单个参数 </h3> <p>路由规则:path='/user/:username'</p> <p>URL 映射:{this.props.location.pathname}</p> <p>username:{this.props.params.username}</p> </div> ) } } ReactDOM.render( <Router history={hashHistory}> <Route path='/user/:username' component={UserComponent}/> </Router>,document.getElementById('app') )
import React from 'react' import ReactDOM from 'react-dom' import {Router,browserHistory} from 'react-router' class UserComponent extends React.Component{ render(){ return ( <div> <h3>OrderComponent 可选参数 </h3> <p>路由规则:path='/order(/:orderid)'</p> <p>URL 映射:{this.props.location.pathname}</p> <p>orderid:{this.props.params.orderid}</p> </div> ) } } ReactDOM.render( <Router history={hashHistory}> <ReactRouter.Route path='/order(/:orderid)' component={UserComponent}/> </Router>,document.getElementById('app') )
效果预览 IndexRoute当访问一个嵌套路由时,指定默认显示的组件 AppComponent.jsimport React from 'react' export default class AppComponent extends React.Component{ render(){ return <div>{this.props.children}</div> } } LoginComponent.jsimport React,{Component} from 'react' export default class LoginComponent extends Component{ login(){} render(){ return <h1>Login</h1> } } HomeComponent.jsimport React,{Component} from 'react' export default class HomeComponent extends Component{ login(){} render(){ return <h1>Home</h1> } } Router.jsimport React from 'react' import {Route,IndexRoute} from 'react-router' import AppComponent from '../components/app/app' import HomeComponent from '../components/home/home' import LoginComponent from '../components/login/login' const routes = ( <Route path="/" component={AppComponent}> <IndexRoute component={HomeComponent} /> <Route path="login" component={LoginComponent} /> <Route path="home" component={HomeComponent} /> </Route> ) export default routes;
模块化可利用组件 router.jsimport React from 'react' import ReactDOM from 'react-dom' import {Route,Router,hashHistory} from 'react-router' import AppComponent from '../components/app/app' import HomeComponent from '../components/home/home' import LoginComponent from '../components/login/login' const routes = ( <Route path="/" component={AppComponent}> <IndexRoute component={HomeComponent} /> <Route path="login" component={LoginComponent} /> <Route path="home" component={HomeComponent} /> </Route> ) ReactDOM.render( <Router history={hashHistory} routes={routes} />,document.getElementById('app') ) 编程式导航
路由钩子函数每个路由都有 onEnter进入路由 let isLogin = (nextState,replace,next) => { if(window.localStorage.getItem('auth') == 'admin'){ next() } else { replace({ pathname: 'login' }) next(); } } const routes = ( <Route path="/" component={AppComponent}> <Route path="login" component={LoginComponent} /> <Route path="home" component={HomeComponent} onEnter={isLogin}/> </Route> ) onLeave对应的 import React from 'react' import {Link} from 'react-router' export default class Component1 extends React.Component{ componentDidMount(){ this.props.router.setRouteLeaveHook( this.props.route,this.routerWillLeave ) } routerWillLeave(){ return '确认要离开?' } render(){ return ( <div> <Link to="/login">Login</Ling> </div> ) } } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |