React router 路由

react路由

特点:虚拟DOM 组件化开发 多端适配

 多端适配 web端 react-router-dom 模块

    native端 react-router-native模块

都依赖react-router模块,不同react版本使用路由方式不同

使用:

  引入react-router-dom:

  

  步骤1 通过Switch组件定义路由渲染位置, 通过Route组件定义路由规则

  path 定义规则(vue规则一样)

  name 定义名称

  component 定义组件

  exact 是否精确匹配

  注:可以不使用Switch组件,此时不能保证同时只显示一个页面

  步骤2 确定路由渲染策略

      用路由策略组件渲染应用程序组件

    BrowerRouter  基于path策略是实现, 类似vue的history策略

      需要服务器端配合,做重定向, 实现的是多页面应用

    HashRouter 基于hash策略实现的

    实现的是单面应用  

拓展:

路由重定向 

  在React路由中, 通过Redirect组件实现路由重定向

  from 定义匹配地址 to 定义重定向地址

默认路由

  路由中 path *  写在最后面

路由导航

   Link组件: to 切换地址, 即使是hash策略  不要以#开头, 只能渲染成a标签      

   与a标签相比, Link组件可以适配不同的路由策略。

   a标签与vue 的router-link区别 router-link 可以适配不同的路由策略 可以渲染成不同的标签

路由数据

  通过Route组件渲染页面组件可以通过属性(this.props)获取路由数据

  match 包含对路由规则解析的数据

       

 

  location 包含当前真实地址的信息(类似全局location)类似于$route

         

 

  history:包含路由操作的方法(类似全局的history 类似于$router

    

 

  没有通过Route组件渲染组件不具有路由数据 获取路由数据 

  1.父子组件通信的方式传递数据可以传递部分数据

  2.继续使用Route组件渲染该组件

  3.使用withRouter方法拓展高阶组件

 

复制代码
import React, { Component } from "react";
import {render} from 'react-dom';
import {Route, BrowserRouter, HashRouter, Link, Redirect,  Switch, withRouter } from 'react-router-dom';

class App extends Component {
    render() {
        console.log('app', this.props);
        let { match } = this.props
        return(      
            <div>
                {/* 1父子组件通信的方式传递数据可以传递部分数据 */}
                {/* App和Header父子 */}
                <Header match={match}></Header>
                <hr/>
                <Switch>
                    {/* exact表示精确匹配 */}
                    <Route path='/' component={Home} exact></Route>
                    <Route path='/list/:page' component={List} ></Route>
                    <Route path='/detail/:id' component={Detail} ></Route>  
                    {/* 重定向 */}
                    <Redirect from="/zihui" to="/detail/zihui"></Redirect>
                    {/* 默认路由 */}
                    <Route path="*" component={Home}></Route>
                </Switch>
                
            </div>
        )
    }
}
class Header extends Component {
    render() {
        console.log('header', this.props);
        return (
            <div>
                <h1>header part</h1>
                {/* 路由导航 */}
                <Link to="/">Home</Link>
                <Link to="/list/1">List</Link>
                <Link to="/detail/1">detail</Link>
                {/* <a href=""></a>定义hash策略不能使用 */}

            </div>
        )
    }
}
class Home extends Component {
    render() {
        console.log('home', this.props);
        return (
            <div>
                <h2>home part</h2>
            </div>
        )
    }
}
class List extends Component {
    render() {
        console.log('list', this.props);
        return (
            <div>
                <h2>list part</h2>
            </div>
        )
    }
}
class Detail extends Component {
    render() {
        console.log('detail', this.props);
        let {history} =  this.props
        return (
            <div>
                <h2>detail part</h2>
                <hr/>
                <Demo history={history}></Demo>
            </div>
        )
    }
}
class Demo extends Component {
    render() {
        console.log('demo', this.props);
        return (
            <div>
                <h2>demo part</h2>
            </div>
        )
    }
}

// 3.使用withRouter方法拓展高阶组件
let RouterApp = withRouter(App);
// hash策略
render(
    <HashRouter>
        {/* <App></App> */}
        {/* 2.没有父组件 route组件渲染 */}
        {/* <Route path="/" component={App}>
        </Route> */}
        {/* 3 */}
        <RouterApp></RouterApp>
    </HashRouter>
    , app)
// path策略, 修改hash不好使, 要搭建服务器修改地址
// render(
//     <BrowserRouter>
//         <App></App>
//     </BrowserRouter>
//     , app)
复制代码

app.js

复制代码
let express = require('express');
let ejs = require('ejs');
console.log(ejs);

// 创建应用
let app =  express();

// 拓展名
app.engine('.html', ejs.__express)

// 静态化
app.use('/dist/', express.static('./dist/'))

// 路由
app.get('*', (req, res) => {
    // 默认去views目录查找
    res.render('../index.html')
})

app.listen(3000, () => {
    console.log('监听在3000端口号');
})
复制代码

index.html

复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
        <div id="app"></div>
        <!-- <script src="./dist/main.js"></script> -->
        <!-- 服务器端上的路径要绝对路径 -->
        <script src="/dist/main.js"></script>
</body>
</html>
复制代码

 

 

 

 

    

 

posted @   子悔君  阅读(332)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· DeepSeek如何颠覆传统软件测试?测试工程师会被淘汰吗?
· 使用C#创建一个MCP客户端
点击右上角即可分享
微信分享提示