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

React/Next.js中ReferenceError: handleClick未定义问题求助

React中解决ReferenceError: handleClick is not defined的问题

我在React代码中遇到了ReferenceError: handleClick is not defined错误,以下是引发错误的代码:

const services = [
  {
    title: (
      <AccordionHeader>
        <AccordionLeft>
          <span>01</span>
        </AccordionLeft>
        <AccordionRight className="icon-container">
          <p>Project Name</p>
          <BsArrowRight
            onClick={handleClick}
            className={`icon ${rotate ? "rotate" : ""}`}
          />
        </AccordionRight>
      </AccordionHeader>
    ),
    content: <> {/* CODE */} </>
  }
];

const ProjectsPage = () => {
  const [rotate, setRotate] = useState(false);

  const handleClick = () => {
    setRotate(!rotate);
  };
  return (
    <>
      {services.map((services, index) => (
        <>
          <Accordion
            key={index}
            title={services.title}
            content={services.content}
          />
          <HrLine />
        </>
      ))}
    </>
  );
};

export default ProjectsPage;

错误截图:
错误截图


错误原因

services数组定义在ProjectsPage组件外部,而handleClick函数和rotate状态都是组件内部的局部变量,外部的数组无法访问这些内部成员,导致渲染时触发未定义错误。

修复方案

方案一:将services数组移到组件内部

把数组放到组件函数内部,让它能直接访问组件内的状态和函数:

const ProjectsPage = () => {
  const [rotate, setRotate] = useState(false);

  const handleClick = () => {
    setRotate(!rotate);
  };

  // 将数组移至组件内部
  const services = [
    {
      title: (
        <AccordionHeader>
          <AccordionLeft>
            <span>01</span>
          </AccordionLeft>
          <AccordionRight className="icon-container">
            <p>Project Name</p>
            <BsArrowRight
              onClick={handleClick}
              className={`icon ${rotate ? "rotate" : ""}`}
            />
          </AccordionRight>
        </AccordionHeader>
      ),
      content: <> {/* CODE */} </>
    }
  ];

  return (
    <>
      {services.map((service, index) => (
        <>
          <Accordion
            key={index}
            title={service.title}
            content={service.content}
          />
          <HrLine />
        </>
      ))}
    </>
  );
};

export default ProjectsPage;

方案二:将title改为参数化函数(适用于数组需外部复用场景)

如果services数组需要放在组件外部复用,可以把title定义为接收参数的函数,在组件渲染时传入handleClick和rotate:

// 外部定义数组,title为函数
const services = [
  {
    title: (handleClick, rotate) => (
      <AccordionHeader>
        <AccordionLeft>
          <span>01</span>
        </AccordionLeft>
        <AccordionRight className="icon-container">
          <p>Project Name</p>
          <BsArrowRight
            onClick={handleClick}
            className={`icon ${rotate ? "rotate" : ""}`}
          />
        </AccordionRight>
      </AccordionHeader>
    ),
    content: <> {/* CODE */} </>
  }
];

const ProjectsPage = () => {
  const [rotate, setRotate] = useState(false);

  const handleClick = () => {
    setRotate(!rotate);
  };

  return (
    <>
      {services.map((service, index) => (
        <>
          <Accordion
            key={index}
            // 调用title函数并传入所需参数
            title={service.title(handleClick, rotate)}
            content={service.content}
          />
          <HrLine />
        </>
      ))}
    </>
  );
};

export default ProjectsPage;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.23 10:05:31