react-router-dom4 学习进阶---react-router4五种写法

v4-v5: https://v5.reactrouter.com/web/example/no-match

v6:https://reactrouter.com/en/main
https://github.com/DudeYouth/react-route-dom-test

https://github.com/supasate/connected-react-router/blob/master/FAQ.md#how-to-migrate-from-v4-to-v5

https://github.com/dL-hx/imoocmanagerhttps://github.com/dL-hx/imoocmanager

+     "react-router-dom": "^4.3.1",

1. demo1-基础使用

在这里插入图片描述
src\pages\route_demo\router1\About.js

import React from 'react'

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

src\pages\route_demo\router1\Main.js

import React from 'react'

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

src\pages\route_demo\router1\Topic.js

import React from 'react'

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

src\pages\route_demo\router1\Home.js

import React from 'react'
import {HashRouter, Route, Link, Switch} from "react-router-dom";//引入路由
import About from "./About";
import Topic from "./Topic";
import Main from "./Main";

export default class Home extends React.Component {//默认输出 对象{}
    render() {
        return (
            <HashRouter>
                <div>
                    <ul>
                        <li>
                            <Link to="/">Home</Link>
                        </li>
                        <li>
                            <Link to="/about">About</Link>
                        </li>
                        <li>
                            <Link to="/topics">Topics</Link>
                        </li>
                    </ul>
                    <hr/>
                    {/*<Route exact={true} path='/' component={Main}></Route>*/}
                    <Switch>
                        <Route exact={true} path='/' component={Main}/>
                        <Route path='/about' component={About}/>
                        <Route path='/topics' component={Topic}/>
                    </Switch>
                </div>
            </HashRouter>
        );
    }
}

2. demo2-嵌套标签组件

在这里插入图片描述
src\pages\route_demo\router2\Home.js

import React from "react";
import { Link } from "react-router-dom"; //引入路由


export default class Home extends React.Component {
  //默认输出 对象{}
  render() {
    return (
      <div>
        <ul>
          <li>
            <Link to="/">Home1</Link>
          </li>
          <li>
            <Link to="/about">About1</Link>
          </li>
          <li>
            <Link to="/topics">Topics1</Link>
          </li>
        </ul>
        <hr />
        {this.props.children}
      </div>
    );
  }
}

src\pages\route_demo\router2\router.js

import React from "react";
import { HashRouter as Router, Route } from "react-router-dom"; //导入路由,为HashRouter起别名:  Router
import About from "./../router1/About";
import Topic from "./../router1/Topic";
import Main from "./../router1/Main";
import Home from "./Home";     //4.0允许在路由中嵌套标签组件    这里是嵌套<Home>组件

export default class IRouter extends React.Component {
  render() {
    return (
      <Router>
        <Home>
          <Route exact={true} path="/" component={Main} />
          <Route path="/about" component={About} />
          <Route path="/topics" component={Topic} />
        </Home>
      </Router>
    );
  }
}

3. demo3-在子组件中进行嵌套路由

在这里插入图片描述
src\pages\route_demo\router3\Home.js

import React from "react";
import { Link } from "react-router-dom"; //引入路由


export default class Home extends React.Component {
  //默认输出 对象{}
  render() {
    return (
      <div>
        <ul>
          <li>
            <Link to="/main">Home1</Link>
          </li>
          <li>
            <Link to="/about">About1</Link>
          </li>
          <li>
            <Link to="/topics">Topics1</Link>
          </li>
        </ul>
        <hr />
        {this.props.children}
      </div>
    );
  }
}

src\pages\route_demo\router3\Main.js

import React from 'react'
import {Link} from 'react-router-dom'
export default class Main extends React.Component {
    render() {
        return (
            <div>
                this is Main page.
                <Link to = "/main/a">嵌套路由</Link>
                <hr/>
                {this.props.children}
            </div>
        );
    }
}

src\pages\route_demo\router3\router.js

import React from "react";
import { HashRouter as Router, Route } from "react-router-dom"; //导入路由,为HashRouter起别名:  Router
import About from "./../router1/About";
import Topic from "./../router1/Topic";
import Main from "./Main";
import Home from "./Home"; //4.0允许在路由中嵌套标签组件    这里是嵌套<Home>组件
/* 嵌套路由中添加 render方法加载
    在子组件中进行嵌套路由 
*/
export default class IRouter extends React.Component {
  render() {
    return (
      <Router>
        <Home>
          <Route
            path="/main"
            render={() => 
              <Main>
                {/* <div>this is a subchild element</div> */}
                <Route path="/main/a" component={About} />
              </Main>
            }
          />
          <Route path="/about" component={About} />
          <Route path="/topics" component={Topic} />
        </Home>
      </Router>
    );
  }
}

4. demo4-测试动态路由功能

在这里插入图片描述
src\pages\route_demo\router4\Home.js

import React from "react";
import { Link } from "react-router-dom"; //引入路由


export default class Home extends React.Component {
  //默认输出 对象{}
  render() {
    return (
      <div>
        <ul>
          <li>
            <Link to="/main">Home1</Link>
          </li>
          <li>
            <Link to="/about">About1</Link>
          </li>
          <li>
            <Link to="/topics">Topics1</Link>
          </li>
        </ul>
        <hr />
        {this.props.children}
      </div>
    );
  }
}

src\pages\route_demo\router4\info.js

import React from 'react'
/* 
{this.props.match.params.xxx}
xxx:是:后面的value      <Route path="/main/:value" component={Info} />
此处写作: {this.props.match.params.value}
*/
export default class Info extends React.Component {
    render() {
        return (
            <div>
                这里是测试动态路由功能
                动态路由的值是: {this.props.match.params.value}
            </div>
        );
    }
}

src\pages\route_demo\router4\Main.js

import React from 'react'
import {Link} from 'react-router-dom'
export default class Main extends React.Component {
    render() {
        return (
            <div>
                this is Main page.
                <br/>
                <Link to = "/main/test-id">嵌套路由1</Link>
                <br/>
                <Link to = "/main/456">嵌套路由2</Link>
                <br/>
                <hr/>
                {this.props.children}
            </div>
        );
    }
}

src\pages\route_demo\router4\router.js

import React from "react";
import { HashRouter as Router, Route } from "react-router-dom"; 
import Info from "./info";
import Topic from "./../router1/Topic";
import About from "./../router1/About";
import Main from "./Main";
import Home from "./Home"; 

export default class IRouter extends React.Component {
  render() {
    return (
      <Router>
        <Home>
          <Route
            path="/main"
            render={() => 
              <Main>
                {/* <div>this is a subchild element</div> */}
                <Route path="/main/:value" component={Info} />
              </Main>
            }
          />
          <Route path="/about" component={About} />
          <Route path="/topics" component={Topic} />

        </Home>
      </Router>
    );
  }
}

5. demo4-NoMatch组件

src\pages\route_demo\router5\Home.js

import React from "react";
import { Link } from "react-router-dom"; //引入路由

/* 1.添加不存在的路由 imooc  
  2.配置404页 
          <Route component={NoMatch}/>
 3. 定义NoMatch(组件)    即404页
 4.在路由中导入  NoMatch组件
---------------
定义NoMatch(组件)    即404页
*/
export default class Home extends React.Component {
  render() {
    return (
      <div>
        <ul>
          <li>
            <Link to="/main">Home1</Link>
          </li>
          <li>
            <Link to="/about">About1</Link>
          </li>
          <li>
            <Link to="/topics">Topics1</Link>
          </li>
          <li>
            <Link to="/imooc1">Imooc</Link>
          </li>
          <li>
            <Link to="/imooc2">Imooc</Link>
          </li>
        </ul>
        <hr />
        {this.props.children}
      </div>
    );
  }
}

src\pages\route_demo\router5\info.js

import React from 'react'
/* 
{this.props.match.params.xxx}
xxx:是:后面的value      <Route path="/main/:value" component={Info} />
此处写作: {this.props.match.params.value}
*/
export default class Info extends React.Component {
    render() {
        return (
            <div>
                这里是测试动态路由功能
                动态路由的值是: {this.props.match.params.value}
            </div>
        );
    }
}

src\pages\route_demo\router5\Main.js

import React from 'react'
import {Link} from 'react-router-dom'
export default class Main extends React.Component {
    render() {
        return (
            <div>
                this is Main page.
                <br/>
                <Link to = "/main/test-id">嵌套路由1</Link>
                <br/>
                <Link to = "/main/456">嵌套路由2</Link>
                <br/>
                <hr/>
                {this.props.children}
            </div>
        );
    }
}

src\pages\route_demo\router5\NoMatch.js

import React from "react";

/* 1.添加不存在的路由 imooc  
  2.配置404页 
          <Route component={NoMatch}/>
 3. 定义NoMatch(组件)    即404页
 4.在路由中导入  NoMatch组件
---------------
定义NoMatch(组件)    即404页
*/
export default class Home extends React.Component {
  render() {
    return (
      <div>
        404 No Pages.
      </div>
    );
  }
}

src\pages\route_demo\router5\router.js

import React from "react";
import { HashRouter as Router, Route ,Switch} from "react-router-dom";
import Info from "./info";
import Topic from "./../router1/Topic";
import About from "./../router1/About";
import Main from "./Main";
import Home from "./Home";
import NoMatch from "./NoMatch";
/* 1.添加不存在的路由 imooc  
  2.配置404页 
          <Route component={NoMatch}/>
 3. 定义NoMatch(组件)    即404页
 4.在路由中导入  NoMatch组件
  + import NoMatch from "./NoMatch"; 

5.添加Switch防止出现多个页面
+ import { HashRouter as Router, Route ,Switch} from "react-router-dom";
---------------
定义NoMatch(组件)    即404页
*/
export default class IRouter extends React.Component {
  render() {
    return (
      <Router>
        <Home>
          <Switch>
            <Route
              path="/main"
              render={() => (
                <Main>
                  {/* <div>this is a subchild element</div> */}
                  <Route path="/main/:value" component={Info} />
                </Main>
              )}
            />
            <Route path="/about" component={About} />
            <Route path="/topics" component={Topic} />

            <Route component={NoMatch} />
            {/*
			<Route path="*">
              <NoMatch />
            </Route>
			*/}
          </Switch>
        </Home>
      </Router>
    );
  }
}

  • 18
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
React Router是一个用于构建单页面应用程序的库。它提供了一种在React应用程序中管理路由的方式。React Router DOM是React Router的一个扩展,用于在Web应用程序中进行路由。 React Router DOM 5和React Router DOM 6之间有几个重要的区别: 1. 安装方式:React Router DOM 5使用npm包管理器进行安装,命令为`npm install react-router-dom`。而React Router DOM 6使用yarn进行安装,命令为`yarn add react-router-dom@next`。 2. 路由组件:在React Router DOM 5中,使用`<Route>`组件来定义路由。而在React Router DOM 6中,使用`<Route>`组件的替代方案`<Routes>`来定义路由。 3. 路由匹配方式:React Router DOM 5使用基于路径的匹配方式来确定哪个路由应该被渲染。而React Router DOM 6引入了新的匹配方式,称为元素匹配(element matching),它可以根据组件的类型来匹配路由。 4. 嵌套路由:在React Router DOM 5中,嵌套路由需要使用嵌套的`<Route>`组件来定义。而在React Router DOM 6中,可以使用嵌套的`<Routes>`组件来定义嵌套路由。 5. 动态路由:在React Router DOM 5中,可以通过在路径中使用参数来定义动态路由。而在React Router DOM 6中,可以使用`<Route>`组件的新属性`element`来定义动态路由。 6. 错误处理:React Router DOM 5使用`<Switch>`组件来处理路由匹配错误。而React Router DOM 6使用`<Routes>`组件的新属性`fallback`来处理路由匹配错误。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小李科技

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值