当前位置:首页 > React

react 如何做下拉菜单

2026-01-25 18:20:33React

使用 React 创建下拉菜单

基础实现(原生 HTML + React 状态)

import { useState } from 'react';

function Dropdown() {
  const [isOpen, setIsOpen] = useState(false);
  const [selectedOption, setSelectedOption] = useState('Select an option');

  const options = ['Option 1', 'Option 2', 'Option 3'];

  const toggleDropdown = () => setIsOpen(!isOpen);

  const handleOptionClick = (option) => {
    setSelectedOption(option);
    setIsOpen(false);
  };

  return (
    <div className="dropdown">
      <button className="dropdown-toggle" onClick={toggleDropdown}>
        {selectedOption}
      </button>
      {isOpen && (
        <ul className="dropdown-menu">
          {options.map((option) => (
            <li key={option} onClick={() => handleOptionClick(option)}>
              {option}
            </li>
          ))}
        </ul>
      )}
    </div>
  );
}

使用第三方库(如 react-select)

安装 react-select:

npm install react-select

实现代码:

react 如何做下拉菜单

import Select from 'react-select';

const options = [
  { value: 'option1', label: 'Option 1' },
  { value: 'option2', label: 'Option 2' },
  { value: 'option3', label: 'Option 3' }
];

function App() {
  const [selectedOption, setSelectedOption] = useState(null);

  return (
    <Select
      defaultValue={selectedOption}
      onChange={setSelectedOption}
      options={options}
    />
  );
}

添加样式

对于原生实现,添加 CSS:

react 如何做下拉菜单

.dropdown {
  position: relative;
  display: inline-block;
}

.dropdown-toggle {
  padding: 8px 16px;
  background: #fff;
  border: 1px solid #ccc;
  cursor: pointer;
}

.dropdown-menu {
  position: absolute;
  top: 100%;
  left: 0;
  list-style: none;
  padding: 0;
  margin: 0;
  border: 1px solid #ccc;
  width: 100%;
}

.dropdown-menu li {
  padding: 8px 16px;
  cursor: pointer;
}

.dropdown-menu li:hover {
  background: #f0f0f0;
}

可访问性改进

添加 ARIA 属性:

<div className="dropdown" role="combobox" aria-expanded={isOpen} aria-haspopup="listbox">
  <button 
    className="dropdown-toggle" 
    onClick={toggleDropdown}
    aria-controls="dropdown-menu"
  >
    {selectedOption}
  </button>
  {isOpen && (
    <ul className="dropdown-menu" id="dropdown-menu" role="listbox">
      {options.map((option) => (
        <li 
          key={option} 
          onClick={() => handleOptionClick(option)}
          role="option"
          aria-selected={selectedOption === option}
        >
          {option}
        </li>
      ))}
    </ul>
  )}
</div>

点击外部关闭

添加点击外部关闭功能:

import { useState, useEffect, useRef } from 'react';

function Dropdown() {
  const [isOpen, setIsOpen] = useState(false);
  const dropdownRef = useRef(null);

  useEffect(() => {
    const handleClickOutside = (event) => {
      if (dropdownRef.current && !dropdownRef.current.contains(event.target)) {
        setIsOpen(false);
      }
    };

    document.addEventListener('mousedown', handleClickOutside);
    return () => {
      document.removeEventListener('mousedown', handleClickOutside);
    };
  }, []);

  return (
    <div className="dropdown" ref={dropdownRef}>
      {/* 其余代码保持不变 */}
    </div>
  );
}

标签: 如何做菜单
分享给朋友:

相关文章

vue实现左右菜单

vue实现左右菜单

实现左右菜单的基本思路 使用Vue实现左右菜单通常需要两个主要组件:左侧的导航菜单和右侧的内容区域。左侧菜单用于导航,右侧区域根据菜单选择动态展示内容。 创建左侧菜单组件 左侧菜单通常是一个列表,可…

vue实现导航菜单

vue实现导航菜单

Vue 实现导航菜单的方法 基础路由导航实现 在 Vue 项目中,使用 vue-router 可以轻松实现导航菜单功能。首先安装并配置路由: npm install vue-router 在 ro…

css制作二级菜单

css制作二级菜单

使用纯CSS制作二级菜单 通过CSS的:hover伪类和子选择器实现二级菜单的显示与隐藏。以下是一个典型的结构和样式示例: HTML结构 <nav class="menu"> &l…

vue实现下拉菜单

vue实现下拉菜单

实现下拉菜单的基本结构 使用 Vue 的 v-show 或 v-if 控制下拉菜单的显示与隐藏。通过点击按钮或父元素触发下拉状态切换。 <template> <div c…

vue实现菜单调用

vue实现菜单调用

Vue 实现动态菜单调用的方法 使用路由配置生成菜单 在 Vue 项目中,可以通过路由配置自动生成菜单结构。路由配置通常包含 path、name、meta 等信息,这些信息可用于构建菜单项。 //…

vue无限菜单怎么实现

vue无限菜单怎么实现

Vue 无限级菜单的实现 实现无限级菜单通常需要递归组件和动态数据结构的结合。以下是具体实现方法: 数据结构设计 采用嵌套结构表示菜单层级,每个菜单项包含 children 属性存储子菜单:…