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

基于React Context实现按钮切换MenuOne与MenuTwo组件

问题:点击按钮切换MenuOne/MenuTwo组件的React Context实现方案

我正在编写SwitchContext和SwitchButton组件,希望点击按钮时在MenuOne和MenuTwo之间切换。尝试在Context里用IF ELSE根据value值控制显示,但没生效,求正确实现方式。


原代码实现

Layout.tsx

<div>
 <SwitchContext>
  <SwitchButton />
   <div><!-- switch MenuOne <> MenuTwo --></div>
 </SwitchContext>
</div>
"use client";
export default function MenuOne() {
  return (
    <div>
      <p>MenuOne</p>
    </div>);
}

SwitchContext.tsx

"use client";
import MenuOne from "./MenuOne";
import MenuTwo from "./MenuTwo";
import { createContext, useContext, useState } from "react";

const SwitchContext = createContext(false);

export default function SwitchContext({children,}: {children: React.ReactNode;}) {
  const [switch, setSwitch] = useState(true);
  const switchFunction = () => {
    setSwitch(!switch);
  return (
    <SwitchContext.Provider value={{ switch, switchFunction }}>
      {children}
    </SwitchContext.Provider>
  );
}
export function useSwitchContext() {
  return useContext(SwitchContext);
}

SwitchButton.tsx

"use client";
import MenuOne from "./MenuOne";
import MenuTwo from "./MenuTwo";

export default function Switch() {
  const { switch, setSwitch } = useSwitchContext();
  return (
    <button type="button" onClick={() => setSwitch(!switch)}></button>
  );
}

问题分析

  • SwitchContext.tsx:switchFunction函数未闭合,return语句位置错误;Context初始值类型与Provider提供的value不匹配(初始是boolean,实际提供的是对象)。
  • SwitchButton.tsx:未导入useSwitchContext;组件命名(Switch)与文件名(SwitchButton.tsx)不符;错误尝试解构setSwitch,但Context里并没有暴露这个方法。
  • Layout.tsx:没有根据Context状态渲染对应的菜单组件,仅留了注释占位。

修正后的完整代码

SwitchContext.tsx

"use client";
import { createContext, useContext, useState, ReactNode } from "react";

interface SwitchContextType {
  isMenuOne: boolean;
  toggleMenu: () => void;
}

const SwitchContext = createContext<SwitchContextType>({
  isMenuOne: true,
  toggleMenu: () => {}
});

export default function SwitchContextProvider({ children }: { children: ReactNode }) {
  const [isMenuOne, setIsMenuOne] = useState(true);
  const toggleMenu = () => setIsMenuOne(!isMenuOne);

  return (
    <SwitchContext.Provider value={{ isMenuOne, toggleMenu }}>
      {children}
    </SwitchContext.Provider>
  );
}

export function useSwitchContext() {
  return useContext(SwitchContext);
}

SwitchButton.tsx

"use client";
import { useSwitchContext } from "./SwitchContext";

export default function SwitchButton() {
  const { toggleMenu } = useSwitchContext();
  return (
    <button type="button" onClick={toggleMenu}>切换菜单</button>
  );
}

Layout.tsx

"use client";
import SwitchContextProvider from "./SwitchContext";
import SwitchButton from "./SwitchButton";
import MenuOne from "./MenuOne";
import MenuTwo from "./MenuTwo";
import { useSwitchContext } from "./SwitchContext";

function MenuRenderer() {
  const { isMenuOne } = useSwitchContext();
  return <div>{isMenuOne ? <MenuOne /> : <MenuTwo />}</div>;
}

export default function Layout() {
  return (
    <div>
      <SwitchContextProvider>
        <SwitchButton />
        <MenuRenderer />
      </SwitchContextProvider>
    </div>
  );
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 17:24:52