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

使用TailwindCSS+Vite开发组件时遇props.handleSelect不是函数错误

解决React组件传参时props.handleSelect is not a function错误

问题根源

你在父组件Navbar中向Menu2传递的函数属性名为onSelect,但在子组件Menu2里却尝试调用props.handleSelect,两者名称不匹配,导致找不到对应的函数,触发类型错误。

解决方案(二选一即可)

方案1:修改子组件,使用正确的属性名

将Menu2中调用函数的地方从props.handleSelect改为props.onSelect,和父组件传递的属性名保持一致:

const Menu2 = (props) => {
  const [click, setClick] = useState(false);

  return (
    <div>
      <button
        name={props.name}
        id={props.id}
        required={props.required}
        value={props.value}
        onClick={() => {
          setClick(!click);
        }}
        onChange={props.onChange}
        className={
          `${props.className} ` +
          ` flex min-w-[100px] flex-row items-center  justify-between rounded font-semibold ${click ? "bg-primary-700" : "bg-none"} border-primary-700 hover:bg-primary-700 border-[2px] pl-[10px]`
        }
      >
        {props.placeholder}
        {click == true ? (
          <img
            src={upIcon}
            style={{ marginTop: "2px", margin: "9px" }}
            height="10px"
            width="20px"
          ></img>
        ) : (
          <img
            src={downIcon}
            style={{ marginTop: "2px", margin: "9px" }}
            height="10px"
            width="20px"
          ></img>
        )}
      </button>

      <div
        className={`${click == true ? "" : "hidden"}  animate-ease-out shadow-primary-700 absolute min-h-[40px] min-w-[100px] max-w-[200px] rounded bg-white text-black shadow-md`}
      >
        {props.options?.map((options) => {
          return (
            <div
              className="hover:bg-primary-700 p-[10px] hover:text-white "
              key={options}
              onClick={() => {
                // 修正为匹配的属性名
                props.onSelect(options);
                // 可选:点击后收起菜单
                setClick(false);
              }}
            >
              {options}
            </div>
          );
        })}
      </div>
    </div>
  );
};

export default Menu2;

方案2:修改父组件,传递匹配的属性名

如果想保持子组件里的props.handleSelect调用,那么在Navbar中传递属性时改为handleSelect={handleSelect}:

const Navbar = () => {
  const handleSelect = (option) => {
    option == "Home"
      ? console.log(option)
      : option == "View Submissions"
      ? console.log(option)
      : console.log(option);
  };

  return (
    <div
      className={`bg-primary-700 flex min-h-[50px] min-w-[100vh] flex-row items-center justify-between p-[5px] text-white `}
    >
      <div
        onClick={() => {
          navigate("/home");
        }}
        className={`pl-[20px] font-semibold hover:cursor-pointer`}
      >
        MICROTEK
      </div>
      <div className={`mr-[10px] flex flex-row`}>
        <Menu2
          placeholder="Navigate"
          options={["View Submissions", "Home"]}
          // 修改为匹配子组件的属性名
          handleSelect={handleSelect}
        ></Menu2>
      </div>
    </div>
  );
};

额外建议

推荐使用方案1,因为onXXX是React组件事件的标准命名方式(比如onClick、onChange),更符合社区规范,代码可读性更高。同时可以在点击菜单选项后调用setClick(false)收起下拉菜单,提升用户体验。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 20:43:13