【sgFileLink】自定义组件:基于el-link、el-icon标签构建文件超链接组件,支持垃圾桶删除、点击预览视频/音频/图片/PDF格式文件

sgFileLink源代码

html 复制代码
<template>
  <div :class="$options.name">
    <el-link @click.stop="clickFile(data)">
      <img :src="getSrc(data)" /><span>{{ getBannerFileName(data) }}</span></el-link
    >
    <el-link
      class="remove-btn"
      v-if="clearable_"
      icon="el-icon-delete"
      :underline="false"
      @click.stop="remove(data)"
    />

    <el-image ref="image" style="display: none" src="" :preview-src-list="[previewSrc]" />
    <sgVideoDialog :data="data_sgVideoDialog" v-model="show_sgVideoDialog" />
    <sgAudioDialog :data="data_sgAudioDialog" v-model="show_sgAudioDialog" />
  </div>
</template>
<script>
import sgVideoDialog from "@/vue/components/admin/sgVideoDialog";
import sgAudioDialog from "@/vue/components/admin/sgAudioDialog";
import $com from "@/js/com";
export default {
  name: "sgFileLink",
  components: { sgVideoDialog, sgAudioDialog },
  data() {
    return {
      data_sgVideoDialog: {},
      show_sgVideoDialog: false,
      data_sgAudioDialog: {},
      show_sgAudioDialog: false,

      previewSrc: null,
      clearable_: null,
    };
  },
  props: ["data", "clearable"],
  computed: {},
  watch: {
    clearable: {
      handler(newValue, oldValue) {
        this.clearable_ = newValue === "" || newValue;
      },
      deep: true, //深度监听
      immediate: true, //立即执行
    },
  },
  created() {},
  mounted() {},
  destroyed() {},
  methods: {
    remove(data) {
      this.$emit(`remove`, data);
    },
    clickFile(d) {
      $com.clickFile(d, this);
    },
    getSrc(d) {
      typeof d === `string` && (d = JSON.parse(d));
      let fileName = d.name;
      let suffix = fileName.split(".").slice(-1)[0];
      return $com.getFlieThumbSrc({ suffix });
    },
    getBannerFileName(d) {
      return $com.getBannerFileName(d);
    },
  },
};
</script>
<style lang="scss" scoped>
.sgFileLink {
  >>> .el-link {
    transition: 0.2s;
    line-height: normal;

    img {
      width: 16px;
      height: 16px;
      object-position: center;
      object-fit: contain;
      transform: translateY(2px);
    }
    span {
      word-wrap: break-word;
      word-break: break-all;
      white-space: break-spaces;
    }
  }
  .remove-btn {
    transition: 0.382s;
    opacity: 0;
    pointer-events: none;
    transform: translateX(-100%);
  }
  &:hover {
    .remove-btn {
      opacity: 1;
      pointer-events: auto;
      transform: translateX(0%);
    }
  }
}
</style>

应用

html 复制代码
<sgFileLink :data="{ ...scope.row, clearable: true }" @remove="remove(scope.row, scope.$index)" />
相关推荐
美狐美颜SDK开放平台1 天前
开发直播APP时如何接入视频美颜SDK?开发流程与注意事项
android·人工智能·计算机视觉·音视频·直播美颜sdk
三十而立洋1 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁1 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
李少兄1 天前
JavaScript 隐式全局变量解析
javascript
2601_955662461 天前
短剧多人对白怎么配?2026年多角色配音工具对比
大数据·人工智能·音视频·语音识别
沙蒿同学1 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端
开发笔记-阿牛1 天前
蓝牙音乐灯拆解,又一次拆到蓝牙音乐灯芯片CK6865L
人工智能·单片机·嵌入式硬件·音视频·音频
paopaokaka_luck1 天前
智慧社区综合服务小程序(人脸识别、AI问答、Echarts图形化分析)
前端·javascript·spring boot·spring·数据分析·echarts
旺仔小馒头wang1 天前
AI 智能手机发布会:赋予人类的五种新能力
人工智能·学习·音视频
Hilaku1 天前
为什么死磕 1px 的团队,用户体验反而更差?
前端·javascript·程序员