当前位置:首页 > React

react实现comfire组件

2026-01-27 05:16:19React

实现 React Confirmation 组件

创建一个可复用的确认对话框组件,用于在用户执行关键操作前进行二次确认。

基本结构

使用 React 的状态管理和事件处理来实现确认对话框:

react实现comfire组件

import React, { useState } from 'react';

const ConfirmationDialog = ({ message, onConfirm, onCancel }) => {
  const [isOpen, setIsOpen] = useState(false);

  const handleConfirm = () => {
    onConfirm();
    setIsOpen(false);
  };

  const handleCancel = () => {
    onCancel();
    setIsOpen(false);
  };

  return (
    <>
      <button onClick={() => setIsOpen(true)}>触发操作</button>

      {isOpen && (
        <div className="confirmation-dialog">
          <div className="dialog-content">
            <p>{message}</p>
            <div className="dialog-actions">
              <button onClick={handleConfirm}>确认</button>
              <button onClick={handleCancel}>取消</button>
            </div>
          </div>
        </div>
      )}
    </>
  );
};

样式优化

添加基本样式使对话框更专业:

react实现comfire组件

.confirmation-dialog {
  position: fixed;
  top: 0;
  left: 0;
  width: 100%;
  height: 100%;
  background-color: rgba(0, 0, 0, 0.5);
  display: flex;
  justify-content: center;
  align-items: center;
  z-index: 1000;
}

.dialog-content {
  background: white;
  padding: 20px;
  border-radius: 8px;
  max-width: 400px;
  width: 100%;
}

.dialog-actions {
  display: flex;
  justify-content: flex-end;
  margin-top: 20px;
  gap: 10px;
}

使用 Portal 优化渲染

为避免 CSS 层级问题,使用 ReactDOM.createPortal:

import ReactDOM from 'react-dom';

const ConfirmationDialog = ({ message, onConfirm, onCancel }) => {
  // ...其他代码

  return (
    <>
      <button onClick={() => setIsOpen(true)}>触发操作</button>

      {isOpen && ReactDOM.createPortal(
        <div className="confirmation-dialog">
          {/* 对话框内容 */}
        </div>,
        document.body
      )}
    </>
  );
};

添加动画效果

使用 CSS 过渡效果增强用户体验:

.confirmation-dialog {
  /* 其他样式 */
  opacity: 0;
  transition: opacity 0.3s ease;
}

.confirmation-dialog.show {
  opacity: 1;
}

.dialog-content {
  transform: translateY(-20px);
  transition: transform 0.3s ease;
}

.confirmation-dialog.show .dialog-content {
  transform: translateY(0);
}

完整实现示例

import React, { useState } from 'react';
import ReactDOM from 'react-dom';
import './ConfirmationDialog.css';

const ConfirmationDialog = ({
  triggerText = "删除",
  message = "确定要执行此操作吗?",
  confirmText = "确定",
  cancelText = "取消",
  onConfirm,
  onCancel,
}) => {
  const [isOpen, setIsOpen] = useState(false);

  const handleConfirm = () => {
    onConfirm && onConfirm();
    setIsOpen(false);
  };

  const handleCancel = () => {
    onCancel && onCancel();
    setIsOpen(false);
  };

  return (
    <>
      <button onClick={() => setIsOpen(true)}>{triggerText}</button>

      {isOpen && ReactDOM.createPortal(
        <div className={`confirmation-dialog ${isOpen ? 'show' : ''}`}>
          <div className="dialog-content">
            <p>{message}</p>
            <div className="dialog-actions">
              <button className="cancel-btn" onClick={handleCancel}>
                {cancelText}
              </button>
              <button className="confirm-btn" onClick={handleConfirm}>
                {confirmText}
              </button>
            </div>
          </div>
        </div>,
        document.body
      )}
    </>
  );
};

export default ConfirmationDialog;

使用示例

import ConfirmationDialog from './ConfirmationDialog';

function App() {
  const handleDelete = () => {
    console.log('项目已删除');
  };

  return (
    <div>
      <ConfirmationDialog
        triggerText="删除项目"
        message="确定要删除这个项目吗?此操作不可撤销。"
        onConfirm={handleDelete}
      />
    </div>
  );
}

高级功能扩展

  1. 自定义渲染:允许传入自定义渲染函数
  2. 异步操作:处理确认时的异步操作
  3. 主题支持:通过 Context 提供主题支持
  4. 键盘交互:添加 ESC 关闭和 Enter 确认功能
const ConfirmationDialog = ({
  // ...其他props
  renderTrigger,
  asyncAction = false,
}) => {
  const [loading, setLoading] = useState(false);

  const handleConfirm = async () => {
    if (asyncAction) {
      setLoading(true);
      try {
        await onConfirm();
      } finally {
        setLoading(false);
        setIsOpen(false);
      }
    } else {
      onConfirm();
      setIsOpen(false);
    }
  };

  return (
    <>
      {renderTrigger ? (
        renderTrigger(() => setIsOpen(true))
      ) : (
        <button onClick={() => setIsOpen(true)}>{triggerText}</button>
      )}

      {/* 对话框内容 */}
      {loading && <div className="loading-overlay">处理中...</div>}
    </>
  );
};

最佳实践建议

  1. 保持组件简单且单一职责
  2. 提供足够的自定义选项
  3. 确保无障碍访问(ARIA 属性)
  4. 在大型应用中考虑使用状态管理
  5. 添加适当的 TypeScript 类型定义

通过以上实现,可以创建一个灵活、可复用的确认对话框组件,满足大多数应用场景的需求。

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

相关文章

vue穿梭框组件实现

vue穿梭框组件实现

实现 Vue 穿梭框组件的基本思路 穿梭框(Transfer)组件通常用于在两个列表之间移动数据项。核心功能包括左侧列表、右侧列表、移动按钮(左移、右移、全选等)以及数据项的渲染与交互。 基础结构设…

vue实现穿梭框树组件

vue实现穿梭框树组件

Vue 穿梭框树组件实现 穿梭框树组件通常结合了树形结构和穿梭框功能,允许用户在左右两栏之间移动树节点数据。以下是基于 Vue 的实现方案: 核心功能设计 数据结构 树形数据通常采用嵌套结构,例如:…

react如何取消渲染

react如何取消渲染

取消渲染的方法 在React中,取消渲染通常指的是在某些条件下阻止组件渲染或中断正在进行的渲染过程。以下是几种常见的方法: 条件渲染 通过条件判断决定是否渲染组件或部分内容。可以使用if语句或三元运…

react moment如何使用

react moment如何使用

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

react如何销毁

react如何销毁

React 组件销毁的机制 在 React 中,组件的销毁通常由 React 的生命周期管理。当组件从 DOM 中移除时,React 会自动触发销毁相关的生命周期方法。以下是关键点: 组件的销毁通常…

react如何卸载

react如何卸载

卸载 React 项目或依赖 如果需要完全卸载 React 项目或相关依赖,可以按照以下步骤操作: 删除项目文件夹 直接删除整个项目文件夹是最彻底的方式。确保已备份重要代码或配置文件。 卸载全局安…