React之自定义路由组件

开篇

        react router功能很强大,可以根据路径配置对应容器组件。做到组件的局部刷新,接下来我会基于react实现一个简单的路由组件。

代码

自定义路由组件

import {useEffect, useState} from "react";
import React from 'react'
// 路由配置
export const MyRouter = ({children})=>{

    // 获取hash,当url中hash变更后会重新渲染
    const [hashVal] = useHash();
    // 获取路由组件
    let targetComponent = null;
    for (let component of children){
        if (component.props.path == hashVal){
            targetComponent = component;
            break;
        }
    }
    // 返回路由组件的内容
    return  targetComponent ? targetComponent.props.component : "Not Found"
}
// 路由項配置
export const Route = () => null;

// 获取浏览器hash hook
const useHash = ()=>{
    const [hash,setHash]= useState(window.location.hash);

    useEffect(()=>{
        const handleHashChange = () => {
            setHash(window.location.hash);
        };
        // 注册hashChange事件
        window.addEventListener('hashchange', handleHashChange);

        return () => {
            window.removeEventListener('hashchange', handleHashChange);
        };
    },[])
    let hashVal = hash;
    if (hash.startsWith('#')){
        hashVal = hash.substr(1)
    }
    return [ hashVal]
}

app.js

import './App.css';
import {MyRouter,Route} from "./component/MyRouter";

const App = ()=> {
    return (
        <div>
            <div className="sider">
                <a href="#page1">Page 1</a>
                <a href="#page2">Page 2</a>
            </div>
            <div className="page-container">
               <MyRouter>
                   <Route path="page1" component ={<span>我是1号</span>} />
                   <Route path="page2" component ={<span>我是2号</span>} />
               </MyRouter>
            </div>
        </div>
    )
}

实现效果

相关推荐

  1. React定义HookuseModel hook

    2024-01-12 02:26:05       47 阅读
  2. 【WPF.NET开发】如何创建定义事件

    2024-01-12 02:26:05       44 阅读
  3. vue脚手架,,过滤器,定义指令

    2024-01-12 02:26:05       31 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-12 02:26:05       18 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-12 02:26:05       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-12 02:26:05       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-12 02:26:05       20 阅读

热门阅读

  1. Docker 有什么优势?

    2024-01-12 02:26:05       31 阅读
  2. 【js】js数组对象去重:

    2024-01-12 02:26:05       38 阅读
  3. LeetCode 2651. 计算列车到站时间

    2024-01-12 02:26:05       37 阅读
  4. flask web学习之表单(一)

    2024-01-12 02:26:05       34 阅读
  5. 力扣289. 生命游戏

    2024-01-12 02:26:05       26 阅读
  6. 数学建模 | 一文读懂:支持向量机(matlab源码)

    2024-01-12 02:26:05       33 阅读
  7. CAS-ABA问题编码实战

    2024-01-12 02:26:05       37 阅读
  8. OpenVoice本地部署教程与踩坑记录

    2024-01-12 02:26:05       31 阅读
  9. 11. 盛最多水的容器

    2024-01-12 02:26:05       40 阅读
  10. Linux(下篇)

    2024-01-12 02:26:05       31 阅读
  11. 重温大学时奋斗的20条

    2024-01-12 02:26:05       31 阅读