在外部脚本文件中
2. 库的引入
React Router库的引入,有两种方式
2.1 浏览器直接引入
可以引用 这里 的浏览器版本,或者下载之后引入
然后就可以直接使用 ReactRouter 这个对象了,我们可能会使用到其中的几个属性
let {Router, Route, IndexRoute, Redirect, IndexRedirect, Link, IndexLink, hashHistory, browserHistory} = ReactRouter;2.2 npm 安装,通过构建工具编译引入
npm install --save react-router
import {Router, Route, IndexRoute, Redirect, IndexRedirect, Link, IndexLink, hashHistory, browserHistory} from "react-router";因浏览器目前还不能支持import与export命令,且babel工具不会将require命令编译,所以我们还得需要如Webpack等构建工具编译引入
class First extends Component { constructor(props) { super(props); } render() { return <p>First</p> }}class Second extends Component { constructor(props) { super(props); } render() { return <p>Second</p> }}class App extends Component { constructor(props) { super(props); } render() { return <div></div> }}
render(( <Router history={hashHistory}> <Route path="/" component={App} /> <Route path="first" component={First} /> <Route path="second" component={Second} /> </Router> ), document.getElementById("box"));首先,Router是一个容器,history属性定义了是用何种方式处理页面的URL
let routes = <div> <Route path="/" component={App} /> <Route path="first" component={First} /> <Route path="second" component={Second} /> </div>;render(<Router routes={routes} history={hashHistory}></Router>, document.getElementById("box"));需要注意的是{routes}中只能有一个父级,所以这里加了<div>标签
class App extends Component { constructor(props) { super(props); } render() { return <div>{this.props.children}</div> }}render(( <Router history={hashHistory}> <Route path="/" component={App}> <Route path="first" component={First} /> <Route path="second" component={Second} /> </Route> </Router> ), document.getElementById("box"));同样的,可以直接在Router中用routes属性定义路由
let routes = <Route path="/" component={App}> <Route path="first" component={First} /> <Route path="second" component={Second} /> </Route>;render(<Router routes={routes} history={hashHistory}></Router>, document.getElementById("box"));4. 路由的其他组件
class First extends Component { constructor(props) { super(props); } render() { return ( <p>First <IndexLink to="/" activeStyle={{color: "red"}}>Basic</IndexLink> </p> ) }}class Second extends Component { constructor(props) { super(props); } render() { return <p>Second</p> }}class Basic extends Component { constructor(props) { super(props); } render() { return ( <ul role="nav"> <li><IndexLink to="/" activeStyle={{color: "red"}}>Basic</IndexLink></li> <li><Link to="/first" activeStyle={{color: "red"}}>First</Link></li> <li><Link to="/Second" activeClass="active">Second</Link></li> </ul> ) }}class App extends Component { constructor(props) { super(props); } render() { return <div> {this.props.children} </div> }}render(( <Router history={hashHistory}> <Route path="/" component={App}> <IndexRoute component={Basic} /> <Route path="first" component={First} /> <Route path="second" component={Second} /> </Route> </Router> ), document.getElementById("box"));
render(( <Router history={hashHistory}> <Route path="/" component={App}> <IndexRoute component={Basic} /> <IndexRedirect to="first" /> <Redirect from="second" to="first" /> <Route path="first" component={First} /> <Route path="second" component={Second} /> </Route> </Router> ), document.getElementById("box"));5. 路由的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="/**/*.jpg"> // 匹配 /files/hello.jpg 和 /files/path/to/file.jpg而:name可以通过 this.props.params 中取到
class First extends Component { constructor(props) { super(props); } render() { return ( <p>First {this.props.params.name} <IndexLink to="/" activeStyle={{color: "red"}}>Basic</IndexLink> </p> ) }}..<Route path="/:name" component={First} />
通过React Dev Tool也可以看到组件的相关数据
6. 路由的onEnter、onLeave钩子
在路由的跳转中,我们可能需要在进入页面或离开页面的时候做一些特殊操作,Route 通过 onEnter 与 onLeave 定义了这两个行为
<Route path="first" component={First} onEnter={(nextState, replace) => { console.log(nextState); alert("onEnter"); // replace("second"); }} onLeave={() => { alert("onLeave"); }}/>如上,带两个参数,通过 replace 可以更新路径,把注释去掉后,进入"/first"时立马跳转值"/second",这在检测登录时应该比较有用
更多的使用参见 指南
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持脚本之家!