Table,vue3在父组件调用子组件columns列的方法展示弹窗文件预览效果

javascript 复制代码
let previewFileHandler: ((record: any) => void) | null = null;

export const columns = [
 
  {
    title: '文件名称',
    dataIndex: 'technicalName',
    width: 180,
    customRender: ({ text, record }) => {
      return h(
        'a',
        {
          style: {
            color: '#1890ff',
            cursor: 'pointer',
            textDecoration: 'underline',
          },
          onClick: (e) => {
            e.stopPropagation();
            // console.log(record, '文件被点击:');
            if (previewFileHandler) {
              previewFileHandler(record);
            } else {
              console.warn('Preview file handler not registered');
            }
            // 预览
          },
        },
        text
      );
    },
  },
  {
    title: '文件分类',
    dataIndex: 'technicalTypeName',
    width: 140,
  },
  
];


export function registerPreviewHandler(handler: (record: any) => void) {
   previewFileHandler = handler;
}

file.data.ts页面

index.vue父组件页面

javascript 复制代码
<templete>
 <PreviewModal @register="registerPreviewModal" />
<templete>

<script name="File" setup>
import {  registerPreviewHandler } from './File.data';
import PreviewModal from './components/PreviewModal.vue';
import {  getViewById } from './sysFileManage.api';
import { useModal } from '/@/components/Modal';

// 注册弹窗
const [registerPreviewModal, { openModal: openPreviewModal }] = useModal();

//文件预览
const previewFile = async (record) => {
  try {
    if (!record || !record.id) {
      console.error('找不到该文件或文件ID缺失');
      message.error('文件信息不完整');
      return;
    }
    
    const res = await getViewById({ id: record.id });
  
    
    if (!res.technicalFiles || res.technicalFiles.length === 0) {
      message.warning('该记录没有可预览的文件');
      return;
    }
    
    let validFile = null;
    for (const item of res.technicalFiles) {
      if (item.filePath || item.fileName) {
        validFile = item;
        break;
      }
    }
    
    if (!validFile) {
      message.warning('缺少文件地址,无法预览');
      return;
    }
    
    openPreviewModal(true, {
      technicalFiles: res.technicalFiles,
    });
  } catch (error) {
    console.error('文件预览失败:', error);
    message.error('文件预览失败,请稍后重试');
  }
};



onMounted(() => {
  registerPreviewHandler(previewFile);

});
</script>
相关推荐
周庆猛10 小时前
Babylon.js 多灯场景在 Windows 上报错:VERTEX shader uniform block count exceeds GL_MAX_VE
前端·数据可视化
胡志辉10 小时前
深入浅出理解浏览器事件循环:从一道输出题讲到 Chrome 源码
前端·javascript·面试
槑有老呆10 小时前
用 Bun 写一个 RESTful TodoList,顺便把面向接口编程整明白
前端
英勇无比的消炎药10 小时前
别再盲目混用AI组件库和传统组件库差距原来这么大
前端·vue.js
ViavaCos10 小时前
AI 帮我写代码,我帮 AI 踩坑:Vue 大数据表格优化全记录
前端·性能优化
lichenyang45310 小时前
聊天消息的「状态」该怎么存?从一堆 boolean 到一个状态机
前端
gz-郭小敏10 小时前
优化横向滚动展示大量数据的时候数据晃动问题
前端·javascript·html·css3
ClouGence10 小时前
自动化测试 CueCast 新版本发布:录制更稳、回放更准、排障更清晰
前端·程序员·测试
骑士雄师10 小时前
19.3 langgraph的工作节点和路由函数
java·前端·数据库
小小小小宇11 小时前
TypeScript类型体操
前端