我试图建立一个应用程序,在不同的页面布局上的侧菜单项将是不同的.我不想硬编码链接,而是试图使其可重复使用.但是,当菜单使用REACT-RUTER-DOM进行包装时,菜单并没有展开.

TestMenuAccordion.tsx:

import { useState } from "react";

const Accordion = ({
  controllerElement,
  contentDescription,
  children,
}: any) => {
  const [isExpanded, setIsExpanded] = useState(false);

  return (
    <div className="w-full mt-4">
      <div
        aria-expanded={isExpanded}
        aria-controls={contentDescription}
        aria-label={(isExpanded ? "hide " : "show ") + contentDescription}
        onClick={() => setIsExpanded((prevIsExpanded) => !prevIsExpanded)}
      >
        {controllerElement(isExpanded)}
      </div>
      {isExpanded && (
        <div id={contentDescription} className="w-full">
          {children}
        </div>
      )}
    </div>
  );
};

export default Accordion;

TestMenu.tsx

import Accordion from "./TestMenuAccordion";
// import "./SideNav.css";
import { Link } from "react-router-dom";

export function SideNavEx(
  props: any,
  { children }: { children: React.ReactNode },
) {
  return (
    <Accordion
      controllerElement={(isExpanded: any) => (
        <button className={isExpanded ? "selected" : "not-selected"}>
          {props.label} {isExpanded ? "-" : "+"}
        </button>
      )}
      contentDescription="menu items"
    >
      <ul className="sideNav">{children}</ul>
    </Accordion>
  );
}

export function GeneralMenuItems(props: any) {
  return (
    <Link to={props.url}>
      <li>{props.text}</li>
    </Link>
  );
}

PageLayout.tsx

import { Outlet } from "react-router-dom";
import { SideNavEx, GeneralMenuItems } from "./TestMenu";

const PageLayout = () => {
  return (
    <>
      <section className="container pt-5 pb-40 px-4 mx-auto grid md:px-8 md:grid-cols-10 md:text-left">
        <div className="px-4 col-span-10 md:col-span-5 lg:col-span-3">

          <SideNavEx label={"General side Menu "}>
            <GeneralMenuItems url={"/Generalmenu1"} text={"Genetal Item 1"} />
            <GeneralMenuItems url={"/Generalmenu2"} text={"Genetal Item 2"} />
            <GeneralMenuItems url={"/Generalmenu3"} text={"Genetal Item 3"} />
          </SideNavEx>

        </div>
        <div className="px-4 pt-4 col-span-10 md:col-span-5 lg:col-span-7">
          <Outlet />
        </div>
      </section>
    </>
  );
};

export default PageLayout;

我正在使用REACT版本18.2和REACT-Router-DOM版本6.21.

推荐答案

看起来您错误地声明了SideNavEx分量.Reaction组件接受单个props 对象,但您已声明SideNavEx接受两个参数.

根据用法,您似乎应该只删除第一个参数props: any,留下一个props 对象,其中一个props 的非 struct 化childrenprops 类型为React.ReactNode,并添加缺少的labelprops .

export function SideNavEx(
  { children, label }: { children: React.ReactNode; label: string }
) {
  return (
    <Accordion
      controllerElement={(isExpanded: boolean) => (
        <button className={isExpanded ? "selected" : "not-selected"}>
          {label} {isExpanded ? "-" : "+"}
        </button>
      )}
      contentDescription="menu items"
    >
      <ul className="sideNav">{children}</ul>
    </Accordion>
  );
}

Javascript相关问答推荐

仅在React和JS中生成深色

fetch在本地设置相同来源的cookie,但部署时相同的代码不会设置cookie

如何通过onClick为一组按钮分配功能;

如何解决CORS政策的问题

使用JavaScript重新排序行

将字符串UTC Date转换为ngx—counting leftTime配置值的数字

为什么!逗号和空格不会作为输出返回,如果它在参数上?

在我的html表单中的用户输入没有被传送到我的google表单中

使用LocaleCompare()进行排序时,首先使用大写字母

是什么导致了这种奇怪的水平间距错误(?)当通过JavaScript将列表项元素追加到无序列表时,是否在按钮之间?

在开发期间,Web浏览器如何运行&qot;.jsx&qot;文件?

react -原生向量-图标笔划宽度

如何找到带有特定文本和测试ID的div?

输入的值的类型脚本array.排序()

Next.js无法从外部本地主机获取图像

JAVASCRIPT SWITCH CASE语句:当表达式为';ALL';

select 2-删除js插入的项目将其保留为选项

为什么这个最小Angular 的Licial.dev设置不起作用?

使用onClick单击子元素时,使用交点观察器的关键帧动画意外运行

如何在Java脚本中添加一个可以在另一个面板中垂直调整大小的面板?