React间接实现一个动态组件逻辑

在开发一个浏览器插件的时候,用的plasmo框架和react支持的,里面使用react开发一个菜单功能,但是又不想使用react-router,所以就想着能不能使用一个很简单的方式做一个替代方案?那肯定是可以。

我在引入一个组件后,我想把这个组件和菜单做一个关联映射,这样当点击菜单后,就可以直接跳转到对应的组件,这才是最理想的一个方式。

所以这里我先引入组件,然后将组件和菜单做了一个映射关系:

javascript 复制代码
import Debug from './first'
import Control from './control'

const menus = [
    {
        key: `control`,
        label: `流程控制`,
        value: <Control />,
    },
    {
        key: `debug`,
        label: `debug`,
        value: <Debug />,
    },
]

然后将这个menus和antd的菜单项做一个渲染:

javascript 复制代码
                <Menu
                    theme="dark"
                    mode="horizontal"
                    defaultSelectedKeys={[menus[0].key]}
                    items={menus}
                    onClick={clickMenu}
                    style={{ flex: 1, minWidth: 0 }}
                />

当点击这个菜单的时候,动态修改content的值,然后将这个content渲染到页面上就可以了:

整体流程代码:

javascript 复制代码
import React, { useState } from 'react'
import './index.scss'
import { Layout, Menu, theme } from 'antd'
import Debug from './first'
import Control from './control'
const { Header, Content, Footer } = Layout

const menus = [
    {
        key: `control`,
        label: `流程控制`,
        value: <Control />,
    },
    {
        key: `debug`,
        label: `debug`,
        value: <Debug />,
    },
]

// menu item
const App: React.FC = () => {
    const {
        token: { colorBgContainer, borderRadiusLG },
    } = theme.useToken()

    // dynamic show component
    const [content, setContent] = useState(<Control />)

    // click menu item
    const clickMenu = (item: any) => {
        const component = menus.find((menu) => menu.key === item.key)?.value
        setContent(component)
    }

    return (
        <Layout className="layout">
            <Header style={{ display: 'flex', alignItems: 'center' }}>
                <div className="logoBox">1024写作助手</div>
                <Menu
                    theme="dark"
                    mode="horizontal"
                    defaultSelectedKeys={[menus[0].key]}
                    items={menus}
                    onClick={clickMenu}
                    style={{ flex: 1, minWidth: 0 }}
                />
            </Header>
            <Content style={{ padding: '0 48px' }}>
                <div
                    style={{
                        background: colorBgContainer,
                        height: '100%',
                        padding: 24,
                        borderRadius: borderRadiusLG,
                    }}
                >
                    {content}
                </div>
            </Content>
            <Footer style={{ textAlign: 'center' }}>
                Ant Helper ©{new Date().getFullYear()} Created by 1024小神
            </Footer>
        </Layout>
    )
}

export default App
相关推荐
llz_1122 小时前
web-第二次课后作业
前端·后端·web
vipbic7 小时前
别再把“做个H5”挂嘴边了:这个词,官方压根就没有定义过
前端
ZC跨境爬虫8 小时前
跟着 MDN 学CSS day_39:(Flexbox 弹性盒子核心机制)
前端·css·ui·html·tensorflow
小陈同学呦8 小时前
前端如何处理订单状态导航的数据竞态问题
前端·javascript
喵个咪9 小时前
GoWind Toolkit 前端代码生成|Vue3(ElementPlus/Vben)、React(AntDesign)全自动一键生成教程
前端·vue.js·react.js
摆烂大大王10 小时前
玩转 OpenClaw:用 TaskFlow + Heartbeat 打造自动化工作流
前端·人工智能·自动化
zhangxingchao10 小时前
AI 大模型核心六:量化、Workflow 与 Agent、多轮 RAG
前端·人工智能·后端
梦想的颜色10 小时前
TypeScript 完全指南(上):从零开始掌握类型系统
前端·typescript
之歆11 小时前
Day01_ES6+ 专业指南:从基础到实战的现代JavaScript开发(下)
前端·javascript·es6
花椒技术11 小时前
复杂直播业务做 RN 跨端,我们最后保留了哪些 Native 边界
react native·react.js·harmonyos