当前位置:首页 > React

React如何写popover

2026-03-11 01:10:13React

React 实现 Popover 的方法

使用 Material-UI 的 Popover 组件

Material-UI 提供了现成的 Popover 组件,可以直接使用。需要安装 @mui/material@emotion 相关依赖。

React如何写popover

import React from 'react';
import Popover from '@mui/material/Popover';
import Button from '@mui/material/Button';

function BasicPopover() {
  const [anchorEl, setAnchorEl] = React.useState(null);

  const handleClick = (event) => {
    setAnchorEl(event.currentTarget);
  };

  const handleClose = () => {
    setAnchorEl(null);
  };

  const open = Boolean(anchorEl);
  const id = open ? 'simple-popover' : undefined;

  return (
    <div>
      <Button aria-describedby={id} variant="contained" onClick={handleClick}>
        Open Popover
      </Button>
      <Popover
        id={id}
        open={open}
        anchorEl={anchorEl}
        onClose={handleClose}
        anchorOrigin={{
          vertical: 'bottom',
          horizontal: 'left',
        }}
      >
        <div style={{ padding: '16px' }}>
          This is the content of the Popover.
        </div>
      </Popover>
    </div>
  );
}

export default BasicPopover;

使用自定义组件实现 Popover

如果需要完全自定义 Popover,可以通过状态管理和 CSS 定位实现。

React如何写popover

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

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

  const togglePopover = () => {
    setIsOpen(!isOpen);
  };

  const closePopover = () => {
    setIsOpen(false);
  };

  return (
    <div style={{ position: 'relative', display: 'inline-block' }}>
      <button ref={anchorRef} onClick={togglePopover}>
        Toggle Popover
      </button>
      {isOpen && (
        <div
          style={{
            position: 'absolute',
            top: '100%',
            left: 0,
            backgroundColor: 'white',
            border: '1px solid #ddd',
            padding: '8px',
            borderRadius: '4px',
            boxShadow: '0 2px 4px rgba(0,0,0,0.1)',
            zIndex: 1000,
          }}
        >
          <div>Custom Popover Content</div>
          <button onClick={closePopover}>Close</button>
        </div>
      )}
    </div>
  );
}

export default CustomPopover;

使用 Reactstrap 的 Popover 组件

Reactstrap 是 Bootstrap 的 React 实现,也提供了 Popover 组件。

import React, { useState } from 'react';
import { Button, Popover, PopoverHeader, PopoverBody } from 'reactstrap';

function ReactstrapPopover() {
  const [popoverOpen, setPopoverOpen] = useState(false);

  const toggle = () => setPopoverOpen(!popoverOpen);

  return (
    <div>
      <Button id="Popover1" type="button">
        Launch Popover
      </Button>
      <Popover
        placement="bottom"
        isOpen={popoverOpen}
        target="Popover1"
        toggle={toggle}
      >
        <PopoverHeader>Popover Title</PopoverHeader>
        <PopoverBody>Popover content goes here.</PopoverBody>
      </Popover>
    </div>
  );
}

export default ReactstrapPopover;

使用第三方库 react-tiny-popover

react-tiny-popover 是一个轻量级的 Popover 库,适合简单场景。

import React, { useState } from 'react';
import { Popover } from 'react-tiny-popover';

function TinyPopover() {
  const [isPopoverOpen, setIsPopoverOpen] = useState(false);

  return (
    <Popover
      isOpen={isPopoverOpen}
      positions={['bottom', 'top', 'left', 'right']}
      content={<div style={{ padding: '8px' }}>Popover Content</div>}
    >
      <button onClick={() => setIsPopoverOpen(!isPopoverOpen)}>
        Click Me
      </button>
    </Popover>
  );
}

export default TinyPopover;

注意事项

  • 定位问题:Popover 的定位需要根据触发元素的位置动态调整,避免超出视口。
  • 事件处理:点击 Popover 外部时通常需要关闭 Popover,可以通过监听全局点击事件实现。
  • 无障碍支持:确保 Popover 的触发元素和内容有正确的 ARIA 属性,例如 aria-haspopuparia-expanded

以上方法可以根据项目需求选择,Material-UI 和 Reactstrap 适合复杂场景,而自定义实现或轻量级库适合简单需求。

标签: 如何写React
分享给朋友:

相关文章

React的isMounted如何使用

React的isMounted如何使用

isMounted的使用方法 React的isMounted方法曾用于检查组件是否已挂载到DOM中,但该方法已被弃用。官方推荐使用其他方式替代。 替代方案 使用useRef和useEffec…

react插件如何写

react插件如何写

React 插件开发基础 React 插件通常以 npm 包形式发布,核心是通过封装可复用的组件或逻辑供其他项目调用。需要遵循 React 组件设计规范,并考虑兼容性、性能优化和文档完整性。 项目初…

react如何写h5

react如何写h5

React 开发 H5 页面的关键步骤 环境搭建与项目初始化 使用 create-react-app 或 Vite 快速初始化项目: npx create-react-app h5-projec…

React如何让modal可以被拖动

React如何让modal可以被拖动

实现可拖动Modal的方法 在React中实现可拖动的Modal,可以通过结合HTML5的拖拽API或第三方库如react-draggable来完成。以下是两种常用方法的详细说明: 使用react-…

React如何点击以后再渲染组件

React如何点击以后再渲染组件

条件渲染实现点击后渲染组件 在React中实现点击后再渲染组件,可以通过状态管理控制组件的渲染条件。核心思路是利用useState钩子存储一个布尔值,通过点击事件切换该状态。 import Reac…

React的热更新如何做

React的热更新如何做

React热更新配置方法 使用Webpack的Hot Module Replacement (HMR)功能实现React组件热更新。确保项目已安装webpack-dev-server和react-ho…