You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React同一div容器内无路由切换时如何从Page2返回Page1组件

解决方案

核心思路是替换布尔类型的状态为多状态枚举,配合映射表渲染组件,彻底解决多组件切换时三元表达式冗余的问题,还可以配合栈结构实现轻量的返回上一级功能,不需要引入react-router。

方案1:枚举状态 + 组件映射表(适合简单的固定跳转场景)

把原来的showForm布尔值换成代表当前页面的枚举值,后续新增页面只需要在映射表里加配置即可,逻辑清晰易维护:

import { useState } from 'react'

// 页面枚举值可根据需求扩展,加page4、page5都可以
const PAGE = {
  PAGE1: 'page1',
  PAGE2: 'page2',
  PAGE3: 'page3'
}

function YourComponent() {
  const [currentPage, setCurrentPage] = useState(PAGE.PAGE1)

  // 组件映射表,所有页面的渲染逻辑统一管理
  const renderPage = {
    [PAGE.PAGE1]: (
      <div className={styles.whitelistBox}>
        <Button 
          className={styles.whiteListToggleButton} 
          shape="round" 
          onClick={() => setCurrentPage(PAGE.PAGE2)}
        >
          Whitelist
        </Button>
      </div>
    ),
    [PAGE.PAGE2]: <Page2 
      onBack={() => setCurrentPage(PAGE.PAGE1)} 
      onGoPage3={() => setCurrentPage(PAGE.PAGE3)}
    />,
    [PAGE.PAGE3]: <Page3 onBack={() => setCurrentPage(PAGE.PAGE2)} />
  }

  return (
    <div className={styles.ticketBox}>
      {renderPage[currentPage]}
    </div>
  )
}

方案2:栈状态管理(适合需要通用返回上一级的场景)

如果页面跳转逻辑复杂、不想手动写每个返回的目标页面,可以用栈结构存储历史页面,天然支持返回上一级能力,和路由的history逻辑一致:

import { useState } from 'react'

const PAGE = {
  PAGE1: 'page1',
  PAGE2: 'page2',
  PAGE3: 'page3'
}

function YourComponent() {
  // 用数组做栈,存储历史页面,初始值为首页
  const [pageStack, setPageStack] = useState([PAGE.PAGE1])
  // 当前页面取栈的最后一个元素
  const currentPage = pageStack.at(-1)

  // 跳转新页面:入栈
  const goPage = (targetPage) => {
    setPageStack(prev => [...prev, targetPage])
  }

  // 返回上一级:出栈(只剩首页时不触发返回)
  const goBack = () => {
    if (pageStack.length > 1) {
      setPageStack(prev => prev.slice(0, -1))
    }
  }

  const renderPage = {
    [PAGE.PAGE1]: (
      <div className={styles.whitelistBox}>
        <Button 
          className={styles.whiteListToggleButton} 
          shape="round" 
          onClick={() => goPage(PAGE.PAGE2)}
        >
          Whitelist
        </Button>
      </div>
    ),
    [PAGE.PAGE2]: <Page2 onBack={goBack} onGoPage3={() => goPage(PAGE.PAGE3)} />,
    [PAGE.PAGE3]: <Page3 onBack={goBack} />
  }

  return (
    <div className={styles.ticketBox}>
      {renderPage[currentPage]}
    </div>
  )
}

补充:如果要使用react-router也可以实现组件内路由

不需要页面级路由的话可以用MemoryRouter,它不会修改浏览器地址栏,完全在组件内部维护路由状态,适合嵌套组件内的多视图切换场景,也可以直接用useNavigate等路由能力。

内容的提问来源于stack exchange,提问作者Leo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 23:15:03