React-Router 4.0基础详解

一、React-Router环境搭建
1、react 环境搭建
参考:我的上一篇博文
2、导入react router依赖包
npm install react-router-dom - -save-dev
二、React-Router基础用例
1文件简介
public
bundle.js —-打包生成文件(输出文件)
index.html—-入口布局文件
component—组件
About.js—-about组件
App.js—app组件
Repos—repos组件
index.js—-入口文件
index.html—-输出布局文件(网页入口)
如图
2、源代码
**public
index.html**

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
  <div id="app"></div>
  <script type="text/babel" src = "../src/index.js"></script>
  <script src="bundle.js"></script>
</body>
</html>

about.js

import React from 'react'
class About extends React.Component{
  render() {
    return <div>This is About page</div>
  }
}
export default About;

App.js

import React from 'react'
class App extends React.Component{
  render() {
    return (
      <div>
        This is App page; 
      </div>
    )
  }
}
export default App;

Repos.js

import React from 'react'

class Repos extends React.Component{
  render() {
    return <div>Thi is Repos page</div>
  }
}
export default Repos;

index.js

import React from 'react'
import {render} from 'react-dom'
import {BrowserRouter as Router, Route, Link} from 'react-router-dom'
import App from './component/App'
import About from './component/About'
import Repos from './component/Repos'

render((
    <Router>
        <ul>
            <li><Link to="/">App</Link></li>
            <li><Link to="/repos">Repos</Link></li>
            <li><Link to="/about">About</Link></li>
            <Route exact path="/" component={App}/>
            <Route path="/repos" component={Repos}/>
            <Route path="/about" component={About}/>
        </ul>
    </Router>
), document.getElementById('app'))

3、打包编译
(1)webpack -p // 打包
(2) webpack-dev-server //开启服务器

三、组件嵌套
1、App.js组件中嵌套其他组件
其他组件不修改

import React from 'react'
import {Link} from 'react-router-dom'

class App extends React.Component{
  render() {
    return (
      <div>
        <h1>React Router Tutorial</h1>
        <ul role="nav">
          <li><Link to="/about">About</Link></li>
          <li><Link to="/repos">Repos</Link></li>
        </ul>
      </div>
    )
  }
}
export default App;

2、打包运行
webpack -p
webpack-dev-server
四、组件作为参数传递
1、代码文件结构
截图
2、源代码
(1)、About.js

import React from 'react'

class About extends React.Component{
  render() {
    return <div>About</div>
  }
}
export default About;

(2)、App.js

import React from 'react'
import {Link} from 'react-router-dom'
import NavLink from "./NavLink"

class App extends React.Component{
    render() {
        return (
            <div>
                <h1>React App</h1>
                <ul role="nav">
                    <li><NavLink to="/about">About</NavLink></li>
                    <li><NavLink to="/repos">Repos</NavLink></li>
                </ul>
                {this.props.children}{/*获取父组件所有子属性*/}
            </div>
        )
    }
}
export default App;

(3)、NavLink.js

import React from 'react'
import {Link} from 'react-router-dom'

class NavLink extends React.Component{
  render() {
    return <Link {...this.props} activeClassName="active"/>//父组件属性传递
  }
}
export default NavLink;

(4)、Repos.js

import React from 'react'

class Repos extends React.Component{
    render() {
        return <div>Repos</div>
    }
}
export default Repos;

(5)、index.js

import React from 'react'
import {render} from 'react-dom'
import {BrowserRouter as Router, Route, Link} from 'react-router-dom'
import App from './component/App'
import About from './component/About'
import Repos from './component/Repos'

render((
    <Router>
        <ul>
            <li><Link to="/">App</Link></li>
            <li><Link to="/repos">Repos</Link></li>
            <li><Link to="/about">About</Link></li>
            <Route exact path="/" component={App}/>
            <Route path="/repos" component={Repos}/>
            <Route path="/about" component={About}/>
        </ul>
    </Router>
), document.getElementById('app'))

(6)运行
webpack -p
webpack-dev-server
五、多层嵌套
1、简介
将Repo组件做为Repos的子组件嵌套,点击Repos链接跳转到Repo中,并将标签名作为参数传递给子组件Repo。
2、源代码
(1)、App.js

import React from 'react'
import NavLink from "./NavLink"

class App extends React.Component{
    render() {
        return (
            <div>
                <h1>React App</h1>
                <ul role="nav">
                    <li><NavLink to="/about">About</NavLink></li>
                    <li><NavLink to="/repos">Repos</NavLink></li>
                </ul>
                {this.props.children}{/*获取父组件所有子属性*/}
            </div>
        )
    }
}
export default App;

(2)、NavLink.js

import React from 'react'
import {Link} from 'react-router-dom'

class NavLink extends React.Component{
  render() {
    return <Link {...this.props} className="active"/>//父组件属性传递
  }
}
export default NavLink;

(3)、Repo.js

import React from 'react'

class Repo extends React.Component{
    render() {
        return (
            <div>
                <h2>{this.props.match.params.repoName}</h2>
            </div>
        )
    }
}
export  default Repo;

(4)、Repos.js

import React from 'react'
import {Link} from 'react-router-dom'
class Repos extends React.Component{
    render() {
        return(
            <div>
                <h2>Repos</h2>
                <ul>
                    <li><Link to='/repos/reactjs/react-router'>React Router</Link></li>
                    <li><Link to="/repos/facebook/react">React</Link></li>
                </ul>
            </div>
        )
    }
}
export default Repos;

(5)、About.js

import React from 'react'

class About extends React.Component{
  render() {
    return <div>About</div>
  }
}
export default About;

(6)、index.js

import React from 'react'
import {render} from 'react-dom'
import {BrowserRouter as Router, Route, Link} from 'react-router-dom'
import App from './component/App'
import About from './component/About'
import Repos from './component/Repos'
import Repo from './component/Repo'

render((
    <Router>
        <ul>
            <li><Link to="/">App</Link></li>
            <li><Link to="/repos">Repos</Link></li>
            <li><Link to="/repos/:userName/:repoName">Repo</Link></li>
            <li><Link to="/about">About</Link></li>
            <Route exact path="/" component={App}/>
            <Route path="/repos" component={Repos}/>
            <Route path="/repos/:userName/:repoName" component={Repo}/>
            <Route path="/about" component={About}/>
        </ul>
    </Router>
), document.getElementById('app'))

6、通过输入框搜索加载组件
1、源代码
(1)、About.js

import React from 'react'
class About extends React.Component{
    render() {
        return <div>About</div>
    }
}
export default About;

(2).App.js

import React from 'react';  //引入react组件
import  NavLink from './NavLink'
 class App extends React.Component{
    render() {
        return (
            <div>
                <h1>React Router</h1>
                <ul>
                    <li><NavLink to="/about">About</NavLink></li>
                    <li><NavLink to="/repos">Repos</NavLink></li>
                     <Route path="/repos" component={Repos}/>
                     <Route path="/repos/:userName/:repoName" component={Repo}/>
                     <Route path="/about" component={About}/>
                </ul>
                {this.props.children}
            </div>
        )
    }
}
export default App;

(3)NavLink.js

import React from 'react'
import { Link } from 'react-router-dom'

class NavLink extends React.Component{
  render() {
    return <Link {...this.props} className="active"/>
  }
}
export default NavLink;

(4).Repo.js

import React from 'react'

class Repo extends React.Component{
  render() {
      const { userName, repoName } = this.props.match.params
      return (
          <div>
              <h2>{userName} / {repoName}</h2>
          </div>
      )
  }
}
export default Repo;

(5).Repos.js

import React from 'react'
import {withRouter} from 'react-router-dom';//按需加载组件,v4.0新功能
import NavLink from './NavLink'
class Repos extends React.Component {
    constructor(props,context){
        super(props,context);
        this.context.router;
        console.log("context",this.context)
    };
    handleSubmit(event) {
        event.preventDefault();
        const userName=event.target.elements[0].value;
        const repo=event.target.elements[1].value;
        const path=`/repos/${userName}/${repo}`;
        this.props.history.push(path);//contextTypes已经过期
    }

    render() {
        return (
            <div>
                <h2>Repos</h2>
                <ul>
                    <li><NavLink to="/repos/reactjs/react-router">React Router</NavLink></li>
                    <li><NavLink to="/repos/facebook/react">React</NavLink></li>
                    <li>
                        <form onSubmit={this.handleSubmit.bind(this)}>
                            <input type="text" placeholder='userName'/>{''}
                            <input type="text" placeholder='repo'/>{''}
                            <button type="submit">Go</button>
                        </form>
                    </li>
                </ul>
                {this.props.children}
            </div>
        )
    };
}
export default withRouter(Repos);//withRouter包装任何自定义组件,将react-router 的 history,location,match 三个对象传入

(6).index.js

import React from 'react';
import {render} from 'react-dom';
import {BrowserRouter as Router, Route, Link} from 'react-router-dom';
import About from './component/About'
import App from './component/App'
import Repos from './component/Repos'
import Repo from './component/Repo'
render((
    <Router>
        <div>
            <ul>
                <li><Link to="/about">About</Link></li>
                <li><Link to="/repos">Repos</Link></li>
                <li><Link to="/repos/:userName/:repoName">Repo</Link></li>
            </ul>
            <hr/>
            <Route path="/" component={App}/>
            <Route path="/repos" component={Repos}/>
            <Route path="/about" component={About}/>
            <Route path="/repos/:userName/:repoName" component={Repo}/>
        </div>
    </Router>
), document.getElementById('app'))
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值