You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Context API实现原生JavaScript风格的确认模态框?

实现确认模态框的OK/Cancel点击逻辑(基于Context API)

1. 完善Context的状态与方法

首先需要在Context中扩展状态,新增确认、取消的回调存储,同时修改open方法支持传入自定义回调:

// context.js
import { createContext, useContext, useState } from "react";

const ConfirmContext = createContext();

export function ConfirmProvider({ children }) {
  const [state, setState] = useState({
    isOpen: false,
    title: "",
    content: "",
    onConfirm: () => {}, // 存储确认回调
    onCancel: () => {}   // 存储取消回调
  });

  const confirm = {
    open: ({ title, content, onConfirm, onCancel }) => {
      setState({
        isOpen: true,
        title,
        content,
        // 兜底空函数避免报错
        onConfirm: onConfirm || (() => {}),
        onCancel: onCancel || (() => {})
      });
    },
    close: () => {
      setState(prev => ({ ...prev, isOpen: false }));
    }
  };

  return (
    <ConfirmContext.Provider value={{ state, confirm }}>
      {children}
    </ConfirmContext.Provider>
  );
}

export function useConfirm() {
  return useContext(ConfirmContext);
}

2. 模态框组件绑定回调触发逻辑

在模态框组件中,给OK/Cancel按钮绑定点击事件,触发Context中存储的回调并关闭模态框:

// 假设你的模态框组件是ConfirmModal.js
import { useConfirm } from "./context";

export default function ConfirmModal() {
  const { state, confirm } = useConfirm();

  if (!state.isOpen) return null;

  const handleConfirm = () => {
    state.onConfirm(); // 执行用户传入的确认逻辑
    confirm.close();   // 关闭模态框
  };

  const handleCancel = () => {
    state.onCancel();  // 执行用户传入的取消逻辑
    confirm.close();   // 关闭模态框
  };

  return (
    <div className="modal-overlay">
      <div className="modal">
        <h3>{state.title}</h3>
        <p>{state.content}</p>
        <div className="modal-buttons">
          <button onClick={handleConfirm}>OK</button>
          <button onClick={handleCancel}>Cancel</button>
        </div>
      </div>
    </div>
  );
}

3. 在Delete组件中传入自定义回调

调用confirm.open时,直接传入OK/Cancel按钮对应的业务逻辑即可:

// Delete.js
import { useConfirm } from "./context";

export default function DeleteButton() {
  const { confirm } = useConfirm();

  const handleDeleteClick = () => {
    confirm.open({
      title: "确认删除",
      content: "你确定要删除这条数据吗?",
      // OK按钮点击后的逻辑:这里写实际删除操作
      onConfirm: () => {
        console.log("执行删除API请求");
        // 示例:删除成功后的提示或状态更新
        alert("删除完成");
      },
      // Cancel按钮点击后的逻辑:可选,比如提示取消操作
      onCancel: () => {
        console.log("用户取消删除");
        alert("已取消删除");
      }
    });
  };

  return <button onClick={handleDeleteClick}>删除</button>;
}

内容的提问来源于stack exchange,提问作者ton1

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 11:15:35