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>
相关推荐
陈随易11 小时前
有生之年系列,Nodejs进程管理pm2 v7.0发布
前端·后端·程序员
冰暮流星11 小时前
javascript之事件代理/事件委托
前端
@yanyu66612 小时前
登录注册功能-明文
vue.js·springboot
陈随易12 小时前
AI时代,你还在坚持手搓文章吗
前端·后端·程序员
里欧跑得慢14 小时前
17. Flutter Hero动画实现:让界面过渡更加优雅
前端·css·flutter·web
IT_陈寒15 小时前
Vue的这个响应式陷阱,我debug了一整天才爬出来
前端·人工智能·后端
cn_mengbei15 小时前
用React Native开发OpenHarmony应用:Reanimated共享元素过渡
javascript·react native·react.js
kyriewen15 小时前
前端测试:别为了100%覆盖率而写测试,那是自欺欺人
前端·javascript·单元测试
去伪存真15 小时前
我自己写的第一个skills--project-core-standards
前端·agent
Data_Journal15 小时前
如何使用cURL更改User Agent
大数据·服务器·前端·javascript·数据库