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

React自定义Dropdown组件无法显示选中项,求添加逻辑指导

解决React Dropdown组件无法显示选中项的问题

要让Dropdown组件显示选中的选项,只需添加状态存储选中值、更新点击逻辑,再把选中值渲染到触发按钮上即可,具体实现步骤如下:

1. 添加选中项状态

在组件中新增useState钩子,用来保存当前选中的选项信息:

const [selectedOption, setSelectedOption] = React.useState(null);

可以根据需求设置初始值,比如{ label: "Menu 1", value: "menu1" },也可以保持null让按钮默认显示"Dropdown"。

2. 更新菜单点击事件

修改菜单选项的点击处理函数,点击时将对应选项信息存入状态:

const handleMenuOne = () => {
  setSelectedOption({ label: "Menu 1", value: "menu1" });
  setOpen(false);
};

const handleMenuTwo = () => {
  setSelectedOption({ label: "Menu 2", value: "menu2" });
  setOpen(false);
};

3. 修改触发按钮的显示内容

将原来固定的"Dropdown"文本替换为选中项的标签,未选中时显示默认文本:

<button onClick={handleOpen}>
  {selectedOption ? selectedOption.label : "Dropdown"}
</button>

4. 可选:给选中菜单项添加高亮样式

如果需要直观标识选中的菜单项,可以在CSS中新增选中状态样式,再在菜单项中判断并添加类:
在CSS文件中新增:

.menu > li.selected {
  background-color: #e0e0e0;
}

然后修改菜单项的li标签:

<li className={`menu-item ${selectedOption?.value === "menu1" ? "selected" : ""}`}>

第二个菜单项做同样处理即可。


修改后的完整代码

App.js

import * as React from "react";
import user_circle_black from "./assets/icons/user_circle_black.svg";

import "./App.css";

const App = () => {
  const [open, setOpen] = React.useState(false);
  // 新增选中项状态
  const [selectedOption, setSelectedOption] = React.useState(null);

  const handleOpen = () => {
    setOpen(!open);
  };

  const handleMenuOne = () => {
    setSelectedOption({ label: "Menu 1", value: "menu1" });
    setOpen(false);
  };

  const handleMenuTwo = () => {
    setSelectedOption({ label: "Menu 2", value: "menu2" });
    setOpen(false);
  };

  return (
    <div className="dropdown">
      {/* 显示选中项或默认文本 */}
      <button onClick={handleOpen}>
        {selectedOption ? selectedOption.label : "Dropdown"}
      </button>
      {open ? (
        <ul className="menu">
          {/* 添加选中状态类 */}
          <li className={`menu-item ${selectedOption?.value === "menu1" ? "selected" : ""}`}>
            <button onClick={handleMenuOne} className="dropdown-menu">
              <img src={user_circle_black} alt="user icon" />
              <p>Menu 1</p>
            </button>
          </li>
          <li className={`menu-item ${selectedOption?.value === "menu2" ? "selected" : ""}`}>
            <button onClick={handleMenuTwo} className="dropdown-menu">
              <img src={user_circle_black} alt="user icon" />
              <p>Menu 2</p>
            </button>
          </li>
        </ul>
      ) : null}
    </div>
  );
};

export default App;

App.css

.dropdown {
  position: relative;
}

.dropdown-menu {
  display: flex;
  align-items: center;
  gap: 0.5rem;
}
.menu {
  position: absolute;

  list-style-type: none;
  margin: 5px 0;
  padding: 0;

  border: 1px solid grey;
  width: 150px;
}

.menu > li {
  margin: 0;

  background-color: white;
}

.menu > li:hover {
  background-color: lightgray;
}

/* 新增选中项样式 */
.menu > li.selected {
  background-color: #e0e0e0;
}

.menu > li > button {
  width: 100%;
  height: 100%;
  text-align: left;

  background: none;
  color: inherit;
  border: none;
  padding: 5px;
  margin: 0;
  font: inherit;
  cursor: pointer;
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 12:53:18