当前位置:首页 > React

react实现弹窗组件

2026-01-26 20:57:28React

实现基础弹窗组件

创建一个基础的弹窗组件需要管理组件的显示状态和内容渲染。以下是一个简单实现:

import React, { useState } from 'react';

const Modal = ({ isOpen, onClose, children }) => {
  if (!isOpen) return null;

  return (
    <div className="fixed inset-0 bg-black bg-opacity-50 flex justify-center items-center">
      <div className="bg-white p-6 rounded-lg shadow-lg">
        {children}
        <button 
          onClick={onClose}
          className="mt-4 px-4 py-2 bg-blue-500 text-white rounded"
        >
          关闭
        </button>
      </div>
    </div>
  );
};

function App() {
  const [isModalOpen, setIsModalOpen] = useState(false);

  return (
    <div>
      <button onClick={() => setIsModalOpen(true)}>打开弹窗</button>
      <Modal 
        isOpen={isModalOpen} 
        onClose={() => setIsModalOpen(false)}
      >
        <h2>弹窗标题</h2>
        <p>这里是弹窗内容...</p>
      </Modal>
    </div>
  );
}

添加动画效果

使用CSS过渡或动画库增强用户体验:

react实现弹窗组件

import React, { useState } from 'react';
import { CSSTransition } from 'react-transition-group';

const Modal = ({ isOpen, onClose, children }) => {
  return (
    <CSSTransition
      in={isOpen}
      timeout={300}
      classNames="modal"
      unmountOnExit
    >
      <div className="fixed inset-0 bg-black bg-opacity-50 flex justify-center items-center">
        <div className="bg-white p-6 rounded-lg shadow-lg">
          {children}
          <button onClick={onClose}>关闭</button>
        </div>
      </div>
    </CSSTransition>
  );
};

// CSS样式
.modal-enter {
  opacity: 0;
}
.modal-enter-active {
  opacity: 1;
  transition: opacity 300ms;
}
.modal-exit {
  opacity: 1;
}
.modal-exit-active {
  opacity: 0;
  transition: opacity 300ms;
}

可复用高阶组件

创建高阶组件封装弹窗逻辑:

react实现弹窗组件

import React, { useState } from 'react';

const withModal = (WrappedComponent) => {
  return function WithModal(props) {
    const [isOpen, setIsOpen] = useState(false);

    const openModal = () => setIsOpen(true);
    const closeModal = () => setIsOpen(false);

    return (
      <>
        <WrappedComponent {...props} openModal={openModal} />
        {isOpen && (
          <div className="modal-overlay">
            <div className="modal-content">
              {props.children}
              <button onClick={closeModal}>关闭</button>
            </div>
          </div>
        )}
      </>
    );
  };
};

// 使用示例
const ButtonWithModal = withModal(({ openModal }) => (
  <button onClick={openModal}>打开弹窗</button>
));

使用Portal优化渲染

使用React Portal确保弹窗渲染在body根部:

import React, { useState } from 'react';
import ReactDOM from 'react-dom';

const ModalPortal = ({ children }) => {
  return ReactDOM.createPortal(
    children,
    document.getElementById('modal-root')
  );
};

const Modal = ({ isOpen, onClose, children }) => {
  if (!isOpen) return null;

  return (
    <ModalPortal>
      <div className="modal-overlay">
        <div className="modal-content">
          {children}
          <button onClick={onClose}>关闭</button>
        </div>
      </div>
    </ModalPortal>
  );
};

// 在public/index.html中添加<div id="modal-root"></div>

支持多种弹窗类型

扩展组件支持警告、确认等不同类型:

const Modal = ({ type, isOpen, onClose, onConfirm, children }) => {
  if (!isOpen) return null;

  return (
    <div className="modal-overlay">
      <div className={`modal-content ${type}`}>
        {children}
        <div className="modal-actions">
          {type === 'confirm' && (
            <button onClick={onClose}>取消</button>
          )}
          <button 
            onClick={type === 'confirm' ? onConfirm : onClose}
            className={type === 'alert' ? 'primary' : ''}
          >
            {type === 'confirm' ? '确认' : '确定'}
          </button>
        </div>
      </div>
    </div>
  );
};

// 使用示例
<Modal 
  type="confirm"
  isOpen={isConfirmOpen}
  onClose={() => setIsConfirmOpen(false)}
  onConfirm={handleConfirm}
>
  确定要执行此操作吗?
</Modal>

标签: 组件react
分享给朋友:

相关文章

react 如何执行

react 如何执行

安装 Node.js 和 npm React 开发需要 Node.js 环境,因为它提供了 npm(或 yarn)包管理工具。从 Node.js 官网 下载并安装最新 LTS 版本。安装完成后,在终端…

react如何调试

react如何调试

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

如何配置react

如何配置react

配置React项目的步骤 安装Node.js和npm 确保系统已安装Node.js(包含npm)。可通过官网下载并安装最新版本。安装完成后,运行以下命令验证版本: node -v npm -v 创建…

react如何循环

react如何循环

循环渲染列表 在React中循环渲染列表通常使用map方法,这是最常用的方式。通过map可以将数组中的每个元素转换为React元素并渲染到页面上。 const items = ['Apple', '…

react如何下载

react如何下载

安装 React 的步骤 通过 npm 或 yarn 安装 React,确保已安装 Node.js(版本建议 ≥ 14.0.0)。打开终端或命令行工具,运行以下命令: npx create-reac…

如何调试react

如何调试react

调试 React 应用的方法 使用 React Developer Tools 安装浏览器扩展(Chrome/Firefox),通过组件树查看组件状态、props 和 hooks。支持实时编辑 pro…