当前位置:首页 > 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 检测点击事件是否发生在下拉菜单外部,实现自动关闭:

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 接收选项数据,并为选项添加点击回调函数:

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>
  );
}

可复用组件优化

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

react实现dropdown

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如何重写alert

react如何重写alert

重写 React 中的 alert 方法 在 React 中,直接使用原生 alert 会破坏用户体验,通常需要自定义弹窗组件替代。以下是实现方法: 使用自定义弹窗组件 创建可复用的弹窗组件,替代原…

react如何引入jq

react如何引入jq

在React中引入jQuery的方法 React和jQuery可以共存,但需要注意避免直接操作DOM,因为React有自己的虚拟DOM机制。以下是几种引入jQuery的方式: 通过npm安装jQue…

react如何引用jquery

react如何引用jquery

在React项目中引用jQuery可以通过以下方法实现: 安装jQuery依赖 通过npm或yarn安装jQuery包: npm install jquery # 或 yarn add jquer…

react如何获取路由

react如何获取路由

获取当前路由路径 在React中获取当前路由路径可以通过react-router-dom提供的useLocation钩子。useLocation返回一个包含当前路由信息的对象,其中pathname属性…

react如何封装router

react如何封装router

封装 React Router 的基本方法 在 React 中封装 Router 通常是为了统一管理路由配置、添加中间件或增强功能。以下是几种常见的封装方式: 基于 react-router-dom…

react如何传参

react如何传参

react传参方法 React中传递参数有多种方式,以下是常见的方法: 父组件向子组件传递参数 通过props传递参数是最常见的方式。父组件在调用子组件时,通过属性传递数据,子组件通过props接…