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

如何在React模态框组件中调用自定义Hook内的函数?

如何在模态框确认按钮中调用自定义Hook里的删除函数?

要实现这个需求,你需要把Hook里的删除逻辑、模态框的控制状态暴露出来,再通过props把删除逻辑传递给模态框的确认按钮。具体修改步骤如下:


1. 修改自定义Hook useTableResource

让Hook返回需要的方法和状态,同时在Hook内部管理模态框的显示状态和当前待删除的行:

import { useState } from 'react';
import axios from 'axios';
import TrashButton from './TrashButton'; // 确保组件路径正确

const useTableResource = () => {
  const [showModal, setShowModal] = useState(false);
  const [currentRow, setCurrentRow] = useState(null);

  // 异步删除函数
  const deleteButton = async (row) => {
    await axios.delete(`test/api/resources?_id=${row.original._id}`);
    console.log("deleted");
  };

  // 打开模态框并记录当前要删除的行
  const openDeleteModal = (row) => {
    setCurrentRow(row);
    setShowModal(true);
  };

  // 关闭模态框并清空当前行记录
  const closeDeleteModal = () => {
    setShowModal(false);
    setCurrentRow(null);
  };

  // 确认删除:调用删除函数后关闭模态框
  const confirmDelete = async () => {
    if (currentRow) {
      await deleteButton(currentRow);
      closeDeleteModal();
    }
  };

  const DeleteHooks = (hook) => {
    hook.visibleColumns.push((columns) => [
      ...columns,
      {
        id: 'delete',
        accessor: () => 'delete',
        Cell: ({ row }) => (
          <div onClick={(event) => event.stopPropagation()}>
            {/* 点击删除按钮时打开模态框 */}
            <TrashButton onClick={() => openDeleteModal(row)} />
          </div>
        )
      }
    ]);
  };

  // 返回需要对外暴露的方法和状态
  return {
    DeleteHooks,
    showModal,
    closeDeleteModal,
    confirmDelete
  };
};

export default useTableResource;

2. 修改TrashModal组件

让模态框接收show、handleClose、handleConfirm三个props,确认按钮直接绑定handleConfirm:

import Modal from 'react-bootstrap/Modal'; // 假设使用react-bootstrap的Modal组件
import Button from 'react-bootstrap/Button';

const TrashModal = ({ show, handleClose, handleConfirm }) => {
  return (
    <>
      <Modal show={show} onHide={handleClose} className="Trashmodal">
        <Modal.Header closeButton>
          <Modal.Title>注意</Modal.Title>
        </Modal.Header>
        <Modal.Body>确认要删除这条数据吗?</Modal.Body>
        <Modal.Footer className="FooterTrash">
          <Button className="btn btn-sm" variant="secondary" onClick={handleClose} autoFocus={true}>
            取消
          </Button>
          <Button className="btn btn-sm btn-primary" onClick={handleConfirm} autoFocus={true}>
            <i className="fa fa-check" aria-hidden="true"></i>确认删除
          </Button>
        </Modal.Footer>
      </Modal>
    </>
  );
};

export default TrashModal;

3. 在表格页面整合Hook与模态框

在使用react-table的页面中,调用自定义Hook并渲染模态框:

import { useTable } from 'react-table';
import useTableResource from './useTableResource';
import TrashModal from './TrashModal';

const TablePage = () => {
  const { DeleteHooks, showModal, closeDeleteModal, confirmDelete } = useTableResource();
  
  // 初始化react-table时应用自定义Hook
  const tableInstance = useTable(
    { columns, data }, // 这里替换为你的表格列配置和数据
    DeleteHooks
  );

  return (
    <>
      {/* 这里放置你的表格渲染代码 */}
      <TrashModal 
        show={showModal} 
        handleClose={closeDeleteModal} 
        handleConfirm={confirmDelete} 
      />
    </>
  );
};

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 00:01:05