当前位置:首页 > React

react实现dropdown

2026-01-26 11:57:47React

实现基础下拉菜单结构

使用 useState 控制下拉菜单的显示状态,通过按钮触发状态切换。基础结构包含按钮和下拉列表:

import { useState } from 'react';

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

  return (
    <div className="dropdown">
      <button onClick={() => setIsOpen(!isOpen)}>Toggle Dropdown</button>
      {isOpen && (
        <ul className="dropdown-menu">
          <li>Option 1</li>
          <li>Option 2</li>
          <li>Option 3</li>
        </ul>
      )}
    </div>
  );
}

添加点击外部关闭功能

通过 useRefuseEffect 检测点击事件是否发生在下拉菜单外部,实现自动关闭:

react实现dropdown

import { useState, useRef, useEffect } 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 ref={dropdownRef} className="dropdown">
      {/* 其余代码同上 */}
    </div>
  );
}

支持动态选项与事件回调

通过 props 接收选项数据,并为选项添加点击回调函数:

react实现dropdown

function Dropdown({ options, onSelect }) {
  const [isOpen, setIsOpen] = useState(false);

  return (
    <div className="dropdown">
      <button onClick={() => setIsOpen(!isOpen)}>Select an option</button>
      {isOpen && (
        <ul className="dropdown-menu">
          {options.map((option) => (
            <li key={option.value} onClick={() => {
              onSelect(option);
              setIsOpen(false);
            }}>
              {option.label}
            </li>
          ))}
        </ul>
      )}
    </div>
  );
}

// 使用示例
<Dropdown 
  options={[
    { value: '1', label: 'Option 1' },
    { value: '2', label: 'Option 2' }
  ]} 
  onSelect={(option) => console.log(option)}
/>

添加动画效果

使用 CSS 过渡或动画库(如 framer-motion)实现平滑展开/收起效果:

import { motion, AnimatePresence } from 'framer-motion';

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

  return (
    <div className="dropdown">
      <button onClick={() => setIsOpen(!isOpen)}>Toggle Dropdown</button>
      <AnimatePresence>
        {isOpen && (
          <motion.ul
            initial={{ opacity: 0, y: -10 }}
            animate={{ opacity: 1, y: 0 }}
            exit={{ opacity: 0, y: -10 }}
            className="dropdown-menu"
          >
            {/* 选项内容 */}
          </motion.ul>
        )}
      </AnimatePresence>
    </div>
  );
}

可复用组件优化

将下拉菜单封装为可复用的高阶组件,支持自定义触发器和菜单内容:

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

  // 添加点击外部关闭逻辑(参考前述代码)

  return (
    <div ref={dropdownRef} className="dropdown">
      {React.cloneElement(trigger, { onClick: () => setIsOpen(!isOpen) })}
      {isOpen && <div className="dropdown-content">{children}</div>}
    </div>
  );
}

// 使用示例
<Dropdown 
  trigger={<button>Custom Trigger</button>}
>
  <div>Custom Dropdown Content</div>
</Dropdown>

标签: reactdropdown
分享给朋友:

相关文章

如何学react

如何学react

学习 React 的基础知识 React 是一个用于构建用户界面的 JavaScript 库。学习 React 的第一步是掌握其核心概念,包括组件、状态(State)、属性(Props)和生命周期方法…

react moment如何使用

react moment如何使用

安装 react-moment 通过 npm 或 yarn 安装 react-moment: npm install react-moment 或 yarn add react-moment 基本…

react如何更新

react如何更新

更新 React 版本的方法 检查当前 React 版本 运行以下命令查看项目中安装的 React 版本: npm list react 更新 React 及相关依赖 通过 npm 或 yarn…

react如何衰减

react如何衰减

React 中的动画衰减效果实现 在 React 中实现衰减效果(如滚动衰减、拖动释放后的惯性滑动)通常需要结合物理动画原理或第三方动画库。以下是几种常见方法: 使用 CSS 动画和 @keyfra…

react如何调试

react如何调试

调试 React 应用的方法 使用 React Developer Tools React Developer Tools 是 Chrome 和 Firefox 的浏览器扩展,可以检查组件树、状态和…

如何用react

如何用react

使用React的基本步骤 安装Node.js和npm 确保系统已安装Node.js和npm。Node.js自带npm,可从官网下载安装包。安装完成后,通过命令行验证版本: node -v npm -…