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>
相关推荐
摘星编程9 小时前
OpenHarmony + RN:Placeholder文本占位
javascript·react native·react.js
a11177610 小时前
医院挂号预约系统(开源 Fastapi+vue2)
前端·vue.js·python·html5·fastapi
0思必得010 小时前
[Web自动化] Selenium处理iframe和frame
前端·爬虫·python·selenium·自动化·web自动化
计算机毕设VX:Fegn089510 小时前
计算机毕业设计|基于springboot + vue蛋糕店管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
行走的陀螺仪12 小时前
uni-app + Vue3编辑页/新增页面给列表页传参
前端·vue.js·uni-app
摘星编程12 小时前
React Native + OpenHarmony:Spinner旋转加载器
javascript·react native·react.js
We་ct13 小时前
LeetCode 205. 同构字符串:解题思路+代码优化全解析
前端·算法·leetcode·typescript
2301_8127314113 小时前
CSS3笔记
前端·笔记·css3
ziblog13 小时前
CSS3白云飘动动画特效
前端·css·css3
越努力越幸运50813 小时前
CSS3学习之网格布局grid
前端·学习·css3