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>
相关推荐
用户47949283569152 小时前
React Hooks 的“天条”:为啥绝对不能写在 if 语句里?
前端·react.js
我命由我123452 小时前
SVG - SVG 引入(SVG 概述、SVG 基本使用、SVG 使用 CSS、SVG 使用 JavaScript、SVG 实例实操)
开发语言·前端·javascript·css·学习·ecmascript·学习方法
用户47949283569153 小时前
给客户做私有化部署,我是如何优雅搞定 NPM 依赖管理的?
前端·后端·程序员
C_心欲无痕3 小时前
vue3 - markRaw标记为非响应式对象
前端·javascript·vue.js
qingyun9893 小时前
深度优先遍历:JavaScript递归查找树形数据结构中的节点标签
前端·javascript·数据结构
胡楚昊3 小时前
NSSCTF动调题包通关
开发语言·javascript·算法
熬夜敲代码的小N3 小时前
Vue (Official)重磅更新!Vue Language Tools 3.2功能一览!
前端·javascript·vue.js
90后的晨仔3 小时前
用 Python 脚本一键重命名序列帧图片的名称
前端
辰同学ovo3 小时前
Vue 2 路由指南:从入门到实战优化
前端·vue.js