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>
    )
}

实现效果

相关推荐
橙露23 分钟前
React Hooks 深度解析:从基础使用到自定义 Hooks 的封装技巧
javascript·react.js·ecmascript
Exquisite.25 分钟前
Nginx
服务器·前端·nginx
2501_9209317036 分钟前
React Native鸿蒙跨平台使用useState管理健康记录和过滤状态,支持多种健康数据类型(血压、体重等)并实现按类型过滤功能
javascript·react native·react.js·ecmascript·harmonyos
打小就很皮...40 分钟前
dnd-kit 实现表格拖拽排序
前端·react.js·表格拖拽·dnd-kit
Ulyanov1 小时前
从静态到沉浸:打造惊艳的Web技术发展历程3D时间轴
前端·javascript·html5·gui开发
打小就很皮...1 小时前
React 19 + Vite 6 + SWC 构建优化实践
前端·react.js·vite·swc
Highcharts.js1 小时前
使用Highcharts与React集成 官网文档使用说明
前端·react.js·前端框架·react·highcharts·官方文档
这是个栗子1 小时前
AI辅助编程(二) - 通译千问
前端·ai·通译千问
VT.馒头1 小时前
【力扣】2625. 扁平化嵌套数组
前端·javascript·算法·leetcode·职场和发展·typescript
数研小生2 小时前
Full Analysis of Taobao Item Detail API taobao.item.get
java·服务器·前端