Vue3 + Element UI 实现文件上传弹出框

Vue3 + Element UI 实现文件上传

实现如下:

1.首页添加按钮点击弹出文件框

给dialog设置传参 展示对话框,设置

页面部分代码如下:

<template>
    <div @click="showfeedbackDialog = true">
        <i class="iconfont icon-yijianfankui"></i>意见反馈
    </div>
    <Feedback
      :feedbackDialogShow="showfeedbackDialog"
      @closeDialog="showfeedbackDialog = false"
      @updateData="updateData()">
    </Feedback>
</template>

语法部分代码如下:

<script setup>
import { ref, onMounted, onUnmounted, watch } from 'vue';
import Feedback from '../systemConfig/feedbackPage/feedback.vue';
import Bus from '@/utils/eventBus.js';
let showfeedbackDialog = ref(false);
</script>

2.弹出框

页面部分代码如下:

<template>
  <el-dialog
    v-model="feedbackDialogShow"
    :close-on-click-modal="false"
    :before-close="closeDialog"
    :destroy-on-close="true"
    class="dialogNormal"
  >
    <template #header>
      <div class="dialogHeader">
        <div>意见反馈</div>
      </div>
    </template>


    <!-- 意见反馈 -->
    <el-form
      ref="ruleFormRef"
      :model="servicesForm"
      :rules="rules"
      label-width="5rem"
      
    >
      <el-row>
        <el-col>
          <el-form-item label="问题描述" prop="description">
            <el-input v-model="servicesForm.description" type="textarea" rows="4" />
          </el-form-item>
        </el-col>
      </el-row>
    </el-form>

 <el-form :model="servicesForm" label-width="5rem">
      <el-row>
        <el-col
          ><el-form-item label="页面截图">
            <el-upload
              v-model:file-list="picList"
              ref="upload"
              action="#"
              :on-change="uploadPic"
              :on-remove="removePic"
              :on-preview="handlePictureCardPreview"
              :auto-upload="false"
              :multiple="true"
              :limit="3"
              :accept="('.jpg', '.jpeg', '.png', '.PNG')"
              list-type="picture-card"
            >
              <el-icon><Plus /></el-icon>
<template #tip>
                <div class="el-upload__tip">
                  仅支持上传jpg、png格式文件,单个文件大小不超过1M,最多可上传3个文件
                </div>
              </template>
            </el-upload>
          </el-form-item>
        </el-col>
      </el-row>
   
    </el-form> 

    <template #footer>
      <el-config-provider :button="{ autoInsertSpace: true }">
        <div class="dialogFooter">
          <el-button @click="closeDialog">取消</el-button>
          <el-button type="primary" @click="submitForm(ruleFormRef)"> 提交 </el-button>
        </div>
      </el-config-provider>
    </template>
    <el-dialog v-model="dialogVisible" class="dialogSmall">
      <template #header>
        <div class="dialogHeader">
          <div>查看大图</div>
        </div>
      </template>
      <img w-full :src="dialogImageUrl" alt="Preview Image" style="width: 100%" />
    </el-dialog>
  </el-dialog>
</template>

语法部分代码如下

<script  setup >
//引入部分
import { ElMessageBox } from 'element-plus';
import { ref, onMounted, nextTick, watch, reactive } from 'vue';
import { addFeedback } from '@/api/feedback.js';

//接受来自父组件的feedbackDialogShow
const props = defineProps({
  feedbackDialogShow: {
    type: Boolean,
    require: true,
    default: false,
  },
});

let feedbackDialogShow = ref(false);
let picList = [];

//文件在表格内的类名
const servicesForm = ref({

  description: '', //问题描述

});

//上传所需内容规则
const rules = reactive({
  description: [{ required: true, message: '请填写问题描述', trigger: 'blur' }],
});

//上传图片 通过图片的raw.type确定上传类型进行上传验证
function uploadPic(UploadFile, UploadFiles) {
  if (['image/jpg', 'image/jpeg', 'image/png'].indexOf(UploadFile.raw.type) == -1) {
    ElMessageBox.alert('请上传正确的图片格式', '提示', {
      confirmButtonText: 'OK',
    });
  }
}

//移除图片 通过找唯一的文件名删除图片
function removePic(UploadFile, UploadFiles) {
  picList.forEach((value, index, array) => {
    if (value.name == UploadFile.name) {
      array.splice(index, 1);
    }
  });
}

// 查看图片大图
function handlePictureCardPreview(file) {
  dialogImageUrl.value = file.url;
  dialogVisible.value = true;
}

function closeDialog() {

  feedbackDialogShow.value = false;
  emit('closeDialog', false);
}

//上传文件

async function submitForm(formEl) {
  if (!formEl) return;
  await formEl.validate((valid, fields) => {
    if (valid) {
      let formData = new FormData();
      formData.append('description', servicesForm.value['description']);
if (toRaw(picList).length > 0) {
       let listPicRaw = [];
        toRaw(picList).forEach(function (e) {
          listPicRaw.push(toRaw(e).raw);
         });
         listPicRaw.forEach((element) => {
           formData.append('picFiles', element);
         });
       } addFeedback(formData).then((data) => {
        closeDialog();
        emit('updateData', '');
      });
       }
  });
}

上述实现弹出框上传文件事件,当文件上传后需要更新文件管理展示页面,所以需要传一个更新值给父组件,后用bus.$on/emit/传递参数给展示页面 

在父组件语法部分加上

function updateData() {
  Bus.$emit('getFeedbackData');
}

在浏览文件页面 添加这一步,当有文件上传后更新文件管理的页面

<script setup>
onMounted(() => {
  getData();
  Bus.$on('getFeedbackData', () => {
    getData();
  });
});
</script>

【vue2 + elementUi实现文件上传】指路,另附有一些常用的文件格式​​​​​​​element-ui el-upload实现上传文件以及简单的上传文件格式验证

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Vue Element UI是一个基于Vue.js前端组件库,而海康视频则是一种视频监控系统。结合两者,可以使用Vue Element UI的弹组件来实现海康视频的功能。 在Vue Element UI中,有一个弹组件`Dialog`可以用于展示内容、表单、图片等。我们可以利用这个弹组件来实现海康视频的弹功能。 首先,我们需要引入Vue Element UI和海康视频的相关依赖包。然后,在Vue的模板中,使用`<el-dialog>`标签来定义一个弹组件。通过设置`visible`属性来控制弹的显示与隐藏。 在弹中,可以使用`<el-form>`标签来展示视频相关的表单,比如输入视频名称、选择视频文件等等。同时,可以使用`<el-upload>`标签来实现视频文件的上传功能。 除此之外,还可以使用`<el-image>`标签来展示视频的缩略图或者封面图。 最后,通过调用Vue的方法或者通过事件绑定来控制弹的显示与隐藏。比如,在点击确认按钮时,可以调用一个方法来处理相关的逻辑。或者,在获取到视频文件后,可以通过事件绑定来触发视频上传的操作。 综上所述,通过Vue Element UI的弹组件,我们可以方便地实现海康视频的弹功能。通过结合VueElement UI的优势,可以快速开发出具有弹功能的海康视频系统。 ### 回答2: VueElement UI是一种用于构建用户界面的开源架和库。Vue是一种流行的JavaScript架,用于构建交互式的Web界面。它具有简单易用的API和强大的能力,使开发人员可以快速构建复杂的前端应用程序。 Element UIVue的一个UI架,它提供了各种用户界面组件和工具,包括弹组件。弹是一种常用的交互式组件,可用于显示消息、警告、确认对话等。 海康视频是一个知名的视频监控解决方案提供商。它提供了一系列视频监控设备、软件和服务,可用于保护和监控各种场所。 结合VueElement UI的弹功能,我们可以使用Element UI提供的弹组件来显示海康视频相关的信息和操作。例如,当需要展示一个海康视频的预览时,我们可以使用Element UI的弹组件来创建一个模态,其中包含视频的预览界面和相关控制按钮,用户可以通过弹中的按钮来操作视频的播放、暂停、停止等功能。 除了预览功能,我们还可以使用弹来展示视频相关的警告信息。例如,当监控系统检测到异常情况时,可以通过弹来显示警告信息,提醒用户及时处理。 总之,VueElement UI的弹功能可以很好地与海康视频集成,为用户提供一个友好的界面来展示和操作海康视频的功能。 ### 回答3: Vue是一种流行的JavaScript架,而Element UI是一个基于Vue的组件库。弹Element UI提供的一个组件,可以在网页中显示弹出窗口,用于展示一些提示、警告或者用户交互的内容。 海康视频是一家专业的视频监控设备供应商,其产品包括监控摄像头、视频录像机等。在使用VueElement UI开发网页时,我们可以使用弹组件来展示海康视频相关的内容。 例如,当用户需要查看一段海康视频时,可以点击一个按钮,触发弹组件显示在界面中央,同时在弹的内容区域中,嵌入海康视频的播放器。这样用户就可以方便地观看视频,而无需离开当前页面。 利用Vue的动态数据绑定特性,我们还可以根据用户的操作改变海康视频的播放状态。例如,在弹中提供一个播放/暂停按钮,用户点击按钮时,我们可以修改Vue的数据状态,从而控制视频的播放或暂停。 此外,Element UI的弹组件还提供了其他丰富的功能选项,如设置弹的大小、位置、背景等样式,以及自定义按钮、输入等交互元素。可以利用这些特性来完善海康视频弹的用户体验。 总结而言,借助VueElement UI的弹组件,可以在网页中方便地展示海康视频,提供给用户良好的用户体验,同时还可以通过Vue的数据绑定特性来控制视频的播放状态。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值