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

React Hooks项目中column.js调用Table.js的openModal打开模态框实现

解决方案

核心逻辑就是把Table组件内维护的openModal回调,注入到column.js的列配置生成函数中,所有状态全部收敛在合法的React组件内管理,完全规避Hook使用规则报错。

1. 改造column.js的导出形式

不要导出固定的列配置数组,改成导出一个接收回调参数的纯函数,删除按钮的点击事件直接调用传入的回调即可,column.js不需要引入任何React相关的Hook或组件逻辑:

// column.js
export const getColumns = (onDeleteClick) => [
  // 其他列配置自行补充
  {
    title: '操作',
    key: 'action',
    width: 120,
    render: (_, record) => (
      <button type="button" onClick={() => onDeleteClick(record)}>删除</button>
    )
  }
]

2. 在Table.js中生成列配置并传入openModal

Table.js作为合法的React组件,本身就维护了模态框的状态和openModal方法,直接将openModal作为参数传给getColumns拿到最终的列配置即可:

// Table.js
import { useState } from 'react'
import { Table, Modal } from 'antd' // 适配你自己使用的UI库即可,逻辑通用
import { getColumns } from './column'

const CustomTable = () => {
  const [modalVisible, setModalVisible] = useState(false)
  const [currentRow, setCurrentRow] = useState({})
  // 表格数据源根据你的业务自行调整
  const tableData = []

  const openModal = (rowData) => {
    setCurrentRow(rowData)
    setModalVisible(true)
  }

  // 动态生成列配置,注入openModal回调
  const columns = getColumns(openModal)

  return (
    <div>
      <Table columns={columns} dataSource={tableData} rowKey="id" />
      <Modal
        title="删除确认"
        open={modalVisible}
        onCancel={() => setModalVisible(false)}
        onOk={() => {
          // 此处可使用currentRow执行删除业务逻辑
          setModalVisible(false)
        }}
      >
        确认删除该条数据吗?
      </Modal>
    </div>
  )
}

export default CustomTable

说明

这种方案完全符合Hook的使用规则:所有Hook都只在React函数组件顶层调用,纯配置文件只负责生成视图配置,不维护任何状态或业务逻辑,数据传递链路清晰,也方便后续维护扩展其他操作列的交互逻辑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.12 03:57:03