[关闭]
@2890594972 2018-05-23T09:21:27.000000Z 字数 5780 阅读 726

react react-router(二)

react react教学


react-router

参考地址:
http://reacttraining.cn/
http://reacttraining.cn/web/guides/quick-start

1、create-react-app

react脚手架。

第一步、安装cnpm

  1. npm install -g cnpm --registry=https://registry.npm.taobao.org

第二步、全局安装create-react-app

  1. cnpm install -g create-react-app

第三步、通过create-react-app初始化一个项目

  1. create-react-app my-app

第四步、在对应的项目文件夹下启动项目

  1. npm start

2、脚手架项目的分析

index.js——一个react项目的入口文件.

  1. import React, { Component } from 'react';
  2. import ReactDOM from 'react-dom';
  3. ReactDOM.render(<h1>hello</h1>,document.getElementById('root'));

组件——
script:var App = React.createClass({});
node:

  1. import React, { Component } from 'react';
  2. class App extends Component{
  3. render(){
  4. return (
  5. <div>hello</div>
  6. )
  7. }
  8. }

App.test.js——用于测试的一个js文件。

重构我们的项目:

2、react-router-dom

react路由。

  1. npm install --save react-router-dom

如果遇到项目无法启动:重新npm install。——>npm start

使用步骤:

第一步

  1. import {
  2. BrowserRouter as Router,
  3. Route,
  4. Link
  5. } from 'react-router-dom';

第二步:申明路由

  1. <Router>
  2. <div>
  3. <Link to='/'></Link>
  4. <Link to='/about'></Link>
  5. <Link to='/topic'></Link>
  6. <Route exact path='/' component={ Home } />
  7. <Route path='/about' component={ About } />
  8. <Route path='/topic' component={ Topic} />
  9. </div>
  10. </Router>

Router:相当于一个组件,申明一个路由的视图。
Link:用于表示路由路径的组件。
Route:用于展示对应路径的组件。

3、路径参数

  1. <Route path='/:id' component={ Child }>
  2. <Link to='/123' ></Link>

子组件中,就能得到这个id。

  1. this.props.match.params.id

4、NavLink。作用和Link的作用是一样的。

但是如果你想给它添加一个actived激活状态的样式,可以考虑使用NavLink。

5、demo

示例1:

  1. <div className='wrapper flex-box flex-col'>
  2. <div className='flex1'>
  3. <Route exact path='/' component={Home} />
  4. <Route path='/about' component={About} />
  5. <Route path='/child' component={Child} />
  6. <Route path='/topics' component={Topics} />
  7. <hr/>
  8. </div>
  9. <div className='flex-box height50'>
  10. <NavLink exact activeClassName="selected" className='flex1 center' to='/'>主页</NavLink>
  11. <NavLink activeClassName="selected" className='flex1 center' to='/about'>购物车</NavLink>
  12. <NavLink activeClassName="selected" className='flex1 center' to='/child'>我的店铺</NavLink>
  13. <NavLink activeClassName="selected" className='flex1 center' to='/topics'>个人中心</NavLink>
  14. </div>
  15. </div>

示例2:

  1. <div>
  2. <NavLink to='/123'>123</NavLink>
  3. <NavLink className='margin-left' to='/345'>345</NavLink>
  4. <NavLink className='margin-left' to='/mapbar_front'>mapbar_front</NavLink>
  5. <Route path='/:id' component={Child}></Route>
  6. </div>
  7. //Child
  8. import React, { Component } from 'react';
  9. class Child extends Component{
  10. componentDidMount(){
  11. console.log('props',this.props);
  12. }
  13. render(){
  14. return (
  15. <div>
  16. Child:{this.props.match.params.id}
  17. </div>
  18. )
  19. }
  20. }
  21. export default Child;

示例3:switch

  1. <div className='wrapper flex-box flex-col'>
  2. <div className='flex1'>
  3. <Switch>
  4. <Route path='/home' component={Home} />
  5. <Route path='/about' component={About} />
  6. <Route path='/child' component={Child} />
  7. <Route path='/topics' component={Topics} />
  8. </Switch>
  9. <hr/>
  10. </div>
  11. <div className='flex-box height50'>
  12. <NavLink exact activeClassName="selected" className='flex1 center' to='/home'>主页</NavLink>
  13. <NavLink activeClassName="selected" className='flex1 center' to='/about'>购物车</NavLink>
  14. <NavLink activeClassName="selected" className='flex1 center' to='/child'>我的店铺</NavLink>
  15. <NavLink activeClassName="selected" className='flex1 center' to='/topics'>个人中心</NavLink>
  16. </div>
  17. </div>

示例4:Redirect

  1. <Router>
  2. <div className='wrapper flex-box flex-col'>
  3. <div className='flex1'>
  4. <Switch>
  5. <Redirect exact from='/' to='/home'/>
  6. <Route path='/home' component={Home} />
  7. <Route path='/about' component={About} />
  8. <Route path='/child' component={Child} />
  9. <Route path='/topics' component={Topics} />
  10. </Switch>
  11. <hr/>
  12. </div>
  13. <div className='flex-box height50'>
  14. <NavLink exact activeClassName="selected" className='flex1 center' to='/home'>主页</NavLink>
  15. <NavLink activeClassName="selected" className='flex1 center' to='/about'>购物车</NavLink>
  16. <NavLink activeClassName="selected" className='flex1 center' to='/child'>我的店铺</NavLink>
  17. <NavLink activeClassName="selected" className='flex1 center' to='/topics'>个人中心</NavLink>
  18. </div>
  19. </div>
  20. </Router>

示例4、嵌套使用的Router

  1. import React, { Component } from 'react';
  2. import { BrowserRouter as Router, Link, Route } from 'react-router-dom';
  3. import Render from './Render/Render';
  4. import Components from './Component/Component';
  5. import Props from './Props/Props';
  6. class Topics extends Component{
  7. render(){
  8. return (
  9. <div>
  10. <h1>
  11. 主题列表
  12. </h1>
  13. <Router>
  14. <div>
  15. <ul>
  16. <li><Link to='/render'>使用 React 渲染</Link></li>
  17. <li><Link to='/component'>组件</Link></li>
  18. <li><Link to='/props'>属性 v. 状态</Link></li>
  19. </ul>
  20. <Route path='/render' component={Render} />
  21. <Route path='/component' component={Components} />
  22. <Route path='/props' component={Props} />
  23. </div>
  24. </Router>
  25. </div>
  26. )
  27. }
  28. }
  29. export default Topics;

示例5、关于嵌套路由的另一种写法:

  1. import React, { Component } from 'react';
  2. import { BrowserRouter as Router, Link, Route } from 'react-router-dom';
  3. import Render from './Render/Render';
  4. import Components from './Component/Component';
  5. import Props from './Props/Props';
  6. class Topics extends Component{
  7. render(){
  8. console.log(this.props);
  9. return (
  10. <div>
  11. <h1>
  12. 主题列表
  13. </h1>
  14. <ul>
  15. <li><Link to={`${this.props.match.path}/render`}>使用 React 渲染</Link></li>
  16. <li><Link to={`${this.props.match.path}/component`}>组件</Link></li>
  17. <li><Link to={`${this.props.match.path}/props`}>属性 v. 状态</Link></li>
  18. </ul>
  19. <Route path={`${this.props.match.path}/render`} component={Render} />
  20. <Route path={`${this.props.match.path}/component`} component={Components} />
  21. <Route path={`${this.props.match.path}/props`} component={Props} />
  22. </div>
  23. )
  24. }
  25. }
  26. export default Topics;

react-router-dom
使用步骤:npm install --save react-router-dom (4.2);

  1. import { BrowserRouter as Router, Link, Route } from 'react-router-dom';

最基本的使用:

  1. import Home from './home/Home.js'
  2. class App extends Component{
  3. render(){
  4. return (
  5. <Router>
  6. <div>
  7. <Link to='/'>Home</Link>
  8. <Link to='/about'>About</Link>
  9. <Route path='/' component={ Home } />
  10. <Route path='/about' component={ About} />
  11. </div>
  12. </Router>
  13. )
  14. }
  15. }

NavLink组件:作用是和Link组件是一样的。
不同点是:能够添加一个activeStyle/activeClass——让当前的link展示高亮。

Switch组件:Switch组件一般包裹在Route外面,它的作用是——匹配第一个符合条件的Route。

  1. <Switch>
  2. <Route path='/home' component={ Home } />
  3. <Route path='/about' component={ About } />
  4. </Switch>

exact属性——能够使我们的Route只匹配其中的一个。

子组件中,也可以定义Router,也就是,可以实现嵌套的路由!!!

Route的另一种用法:

  1. 一般用法:<Route path='/' component={ Home } />
  2. 特殊用法:<Route to='/' children={(params)=>{
  3. if(params){
  4. return <h1>hello</h1>
  5. } else {
  6. return <h3>world</h3>
  7. }
  8. }} />

根据参数的不同,展示不同的视图。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注