react路由

一、简单路由使用

1、安装

cnpm install react-router-dom --save

2、找到项目的根组件引入react-router-dom

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

3、找到官网文档根组件里面的内容进行修改(加载组件要提前引入)

import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import './assets/css/index.css'
import Home from './components/Home';
import News from './components/News';
import Product from './components/Product';
import Content from './components/Content';
import ProductContent from './components/ProductContent';

class App extends Component {

  render() {
    return (
        <Router>
          <div>           
              <header className="title">
                <Link to="/">首页</Link>
                <Link to="/news">新闻</Link>
                <Link to="/product">商品</Link>
              </header>
               <br />
               <hr />
              <Route exact path="/" component={Home} />
              <Route path="/news" component={News} />    
              <Route path="/product" component={Product} /> 
              <Route path="/productcontent" component={ProductContent} />
              <Route path="/content/:aid" component={Content} />                 
          </div>
      </Router>
    );
  }
}

export default App;
// 引入封装好的路由
import routes from './model/router'

function App() {
    return (
        <Router>
            <div>
                <header className='title'>
                    <Link to='/'>首页组件</Link>
                    <Link to='/User'>用户组件</Link>
                    <Link to='/Shop'>商户组件</Link>
                </header>
                {/* 封装好routes直接引入遍历 */}
                {
                    routes.map((route, key) => {
                        if (route.exact) {
                            return <Route key={key} exact path={route.path} component={route.component}></Route>
                        } else {
                            return <Route key={key} path={route.path} component={route.component}></Route>
                        }
                    })
                }
                {/* 
                    未封装的路由
                    <Route exact path='/' component={Home}></Route>
                    <Route path='/User' component={User}></Route>
                    <Route path='/Shop' component={Shop}></Route> 
                */}
            </div>
        </Router>
    );
}

备注:exact表示严格匹配

二、react动态路由传参

1、动态路由配置

<Route path="/content/:aid" component={Content} />   

2、对应的动态路由加载的组件里面获取传值

this.props.match.params

跳转:

<Link to={`/content/${value.aid}`}>{value.title}</Link>

三、路由模块化及嵌套路由------直接贴代码吧

自定义路由模块
在这里插入图片描述
app.js页面

import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";
import './assets/css/index.css';
import routes from './model/router.js';
class App extends Component {
  render() {
    return (
      <Router>
        <div>
          <header className="title">
            <Link to="/">首页组件</Link>
            <Link to="/user">用户页面</Link>
            <Link to="/shop">商户</Link>
            <Link to="/news">新闻</Link>
          </header>
          {/* routes是封装好的路由直接遍历 */}
          {
            routes.map((route, key) => {
              if (route.exact) {
                return <Route key={key} exact path={route.path}
                  // route.component     value.component   <User  {...props}  routes={route.routes} />
                  render={props => (
                    // pass the sub-routes down to keep nesting
                    <route.component {...props} routes={route.routes} />
                  )}
                />
              } else {
                return <Route key={key} path={route.path}
                  render={props => (
                    // pass the sub-routes down to keep nesting
                    <route.component {...props} routes={route.routes} />
                  )}
                />
              }
            })
          }
        </div>
      </Router>
    );
  }
}

export default App;

user页面的使用

import React, { Component } from 'react';
import { BrowserRouter as Router, Route, Link } from "react-router-dom";

class User extends Component {
    constructor(props) {
        super(props);
        this.state = {
            msg: '我是一个User组件'
        };
    }
    componentWillMount() {
        console.log(this.props.routes);
    }
    render() {
        return (
            <div className="user">
                <div className="content">
                    <div className="left">
                        <Link to="/user/">用户列表</Link><br />
                        <Link to="/user/add">增加用户</Link><br />
                        <Link to="/user/edit">编辑用户</Link>
                    </div>
                    <div className="right">
                        {
                            this.props.routes.map((route, key) => {
                                return <Route key={key} exact path={route.path} component={route.component} />
                            })
                        }
                        {/* <Route  path="/user/add" component={UserAdd} /> */}
                    </div>
                </div>
            </div>
        );
    }
}

export default User;

四、实现js路由跳转

1、引入Redirect

import {
        BrowserRouter as Router,
        Route,
        Link,
        Redirect,
        withRouter
	   } from "react-router-dom";	

2、定义一个flag

 	this.state = {  
     	 loginFlag:false
   };

3、render里面判断flag来决定是否跳转

 if (this.state.loginFlag) {
    return <Redirect to={{ pathname: '/' }} />
 }

4、要执行js跳转
通过js改变loginflag的状态
改变以后从新render 就可以通过Redirect组件来跳转

import React, { Component } from 'react';
import { Redirect } from "react-router-dom";//引入Redirect

class Login extends Component {
    constructor(props) {
        super(props);
        this.state = {
            loginFlag: false//是否进行跳转
        };
    }
    dologin = (e) => {
        e.preventDefault();//阻止表单默认属性
        let username = this.refs.username.value;
        let password = this.refs.password.value;
        console.log(username, password);
        if (username === 'admin' && password === '123456') {
            // 登录成功     跳转到首页
            console.log(username, password)
            this.setState({
                loginFlag: true
            })
        } else {
            alert('登录失败')
        }
    }
    render() {
        // 如果loginFlag为true执行跳转
        if (this.state.loginFlag) {
            return <Redirect to={{ pathname: '/' }} />
            // return <Redirect to='/' />
        }
        return (
            <div>
                <form onSubmit={this.dologin}>
                    {/* <input type="text" value={this.state.username}/><br/><br/> */}
                    <input type="text" ref='username' /><br /><br />
                    <input type="password" ref='password' /><br /><br />
                    <input type="submit" value='执行登录' />
                </form>
            </div>
        );
    }
}
export default Login;

巴拉巴拉~~主页传送门

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值