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

NextJS侧边栏路由问题:点击链接仅显示对应组件

解决侧边栏点击后仅显示对应组件的问题

方法一:用单个状态管理当前激活标签(推荐)

把原来两个独立的状态合并成一个,通过记录当前选中的标签来控制组件显示,逻辑更简洁,避免状态冲突:

修改DashBase组件的状态和切换逻辑:

const DashBase = () => {
  const isDesktop = useBreakpointValue({ base: false, lg: true })
  // 单个状态记录当前激活标签,初始null表示都不显示
  const [activeTab, setActiveTab] = React.useState(null)

  // 点击时切换激活状态,重复点击可关闭
  const toggleLibrary = () => setActiveTab(activeTab === 'library' ? null : 'library')
  const toggleTasks = () => setActiveTab(activeTab === 'tasks' ? null : 'tasks')
  const router = useRouter()

  return (
    <Flex>
      {isDesktop ? <Sidebar toggleLibrary={toggleLibrary} toggleTasks={toggleTasks} /> : <Navbar />}
      <Container py="8" flex="none">
        {/* 根据激活标签渲染对应组件 */}
        {activeTab === 'library' && <Library />}
        {activeTab === 'tasks' && <Tasks />}
      </Container>
    </Flex>
  )
}

方法二:修改原有切换函数,重置其他状态

如果不想大幅改动原有代码,可在切换时强制将另一个组件的显示状态设为false:

const DashBase = () => {
  const isDesktop = useBreakpointValue({ base: false, lg: true })
  const [showLibrary, setShowLibrary] = React.useState(false)
  const [showTask, setShowTask] = React.useState(false)

  // 点击Library时,先关闭Tasks,再切换Library状态
  const toggleLibrary = () => {
    setShowTask(false)
    setShowLibrary(!showLibrary)
  }
  // 点击Tasks时,先关闭Library,再切换Tasks状态
  const toggleTasks = () => {
    setShowLibrary(false)
    setShowTask(!showTask)
  }
  const router = useRouter()

  return (
    <Flex>
      {isDesktop ? <Sidebar toggleLibrary={toggleLibrary} toggleTasks={toggleTasks} /> : <Navbar />}
      <Container py="8" flex="none">
        {showLibrary ? <Library /> : '' }
        {showTask ? <Tasks /> : '' }
      </Container>
    </Flex>
  )
}

说明

  • 方法一的优势是状态结构更清晰,后续新增侧边栏选项时,只需扩展activeTab的取值即可,维护成本更低。
  • 方法二适合快速适配原有代码的场景,通过主动重置其他状态保证同一时间仅显示一个组件。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 13:45:46