React之自定义路由组件

开篇

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

代码

自定义路由组件

javascript 复制代码
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

javascript 复制代码
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>
    )
}

实现效果

相关推荐
新中地GIS开发老师15 小时前
WebGIS开发学生作品|低空航天管理与航线规划系统
前端·javascript·webgis·三维gis开发
用户0595401744615 小时前
大模型对话记忆持久化踩坑实录:用 Playwright 自动化测了 300 次,终于揪出会话丢失的真凶
前端·css
丙氨酸長鏈16 小时前
Web前端入门第 问:JavaScript 一个简单的 IndexedDB 数据库入门示例
前端·javascript·数据库
kyriewen16 小时前
面试官让我手写虚拟列表——AI生成的版本,快速滚动几下就白屏了
前端·javascript·面试
IT_陈寒17 小时前
Vite热更新失效?你可能漏了这个配置
前端·人工智能·后端
梅孔立17 小时前
两种免费的翻译API调用方式详解 - Edge官方API与个人缓存服务
前端·缓存·edge
Revolution6117 小时前
React 组件重新渲染时,到底重新执行了什么
前端·react.js·面试
林焱_RPAAI17 小时前
影刀RPA技术深度:CSS选择器高级实战指南——伪类属性选择器与性能对比完全解析
vue.js·react.js
用户21816970493019 小时前
Flutter(四)Dart语法 空安全 运算符 流程控制
前端
许彰午19 小时前
政务督办的分合模式:主办协办的并发审批
前端·javascript·政务