Elementplus+vue3.x实现手动上传文件

<template>
  <el-dialog
    v-model="dialogVisible3"
    title="上传附件"
    @close="handleClickClose"
    width="25%"
  >
      <el-upload
        ref="upload"
        action="#"
        drag
        :auto-upload="false"
        :on-change="onChange"
        :before-remove="beforeRemove"
        :file-list="fileList"
        :before-upload="beforeUpload"
        multiple
      >
        <el-icon class="el-icon--upload" style="width:30%"><upload-filled /></el-icon>
      </el-upload>
      <div class="button-container">
        <el-button  size="mini" type="success" @click="submit">提交</el-button>
        <el-button type="primary" @click="handleClickClose">取消</el-button>
      </div>
  </el-dialog>
</template>

<script setup>
import { ref } from 'vue';
import { ElMessage, ElMessageBox,ElUpload } from 'element-plus';

const upload = ref();


const props=defineProps({
param:{
  type: String,
    default: -1,
  },
  goinitTable: Function //父组件的函数
})

      
const goinitTable = () => {
  props.goinitTable()
}

  
const data = ref({
  param1: '',
  param2: ''
})

watch(
  ()=>props.param,
  ()=>{
      if(props.param!= -1){
        data.value.param1=props.param
      }
  }
)


const fileList = ref([]);
const ACCEPTED_EXTENSIONS = ['doc', 'xls', 'ppt', 'txt', 'pdf', 'png', 'jpg', 'jpeg'];

/**
 * 请求前判断文件是否符合要求
 * 如果符合则添加到上传队列
 */
function beforeUpload(file) {
  const extension = file.name.split('.').pop().toLowerCase();
  if (!ACCEPTED_EXTENSIONS.includes(extension)) {
    ElMessage({
      type: 'error',
      message: '仅支持 doc, xls, ppt, txt, pdf, png, jpg 和 jpeg 格式的文件',
    });
    return false;
  }
  return true;
}

/**
 * 文件选择改变时触发
 */
function onChange(file, fileListVal) {
  fileList.value = fileListVal;
}

function beforeRemove(file, fileListVal) {
  fileList.value = fileListVal;
}

/**
 * 提交请求
 * 处理上传逻辑
 */
async function submit() {
  if (fileList.value.length === 0) {
    return ElMessage.error('请选择要上传的文件');
  }

  
  const url = "后端上传Api";
  const formData = new FormData();

  fileList.value.forEach((file) => {
    formData.append('file', file.raw);
    
  });
  formData.append('param1', data.value.param1);
  formData.append('param2', data.value.param2);

  try {
    const response = await fetch(url, {
      method: 'POST',
      body: formData,
    });

    if (response.ok) {
      const data = await response.json();
      ElMessage({
        type: 'success',
        message: '文件上传成功',
      });
      clearAttachments();
      handleClickClose()
      emits("initTableList")
      goinitTable()
    } else {
      throw new Error('文件上传失败');
    }
  } catch (error) {
    ElMessage({
      type: 'error',
      message: error.message || '文件上传失败',
    });
  }
}

// 清空附件列表
const clearAttachments = () => {
  if (upload.value) {
    upload.value.clearFiles(); // 调用实例方法 `clearFiles` 清空附件列表
    console.log("已清空附件列表");
  }
};

/**向父组件抛出一个方法 */
const emits = defineEmits(['update:modelValue','initTableList']);
/**点击close触发 */
const handleClickClose = ()=>{
    emits('update:modelValue',false);
}
</script>

<style scoped>
.button-container {
  display: flex;
  justify-content: center;
  align-items: center;
  height: 100%; 
}

::v-deep .el-upload {
  width:100%;
}
</style>

首先,你需要在项目中安装以下依赖: 1. vite:用于快速搭建现代化的 Web 应用程序。 2. vue@next:Vue 3 框架。 3. element-plus:一个基于 Vue 3 的 UI 组件库,可快速构建美观的 Web 应用程序。 4. jsplumb:一个流程图工具,可用于创建和管理复杂的流程图。 5. pinia:Vue 3 的状态管理库,用于管理应用程序的状态。 6. sortablejs:一个可拖动和排序列表的 JavaScript 库。 接下来,你需要创建一个新的 Vue 3 项目,并安装上述依赖: ``` npm init vite-app my-app cd my-app npm install npm install vue@next element-plus jsplumb pinia sortablejs ``` 然后,你需要在 `main.js` 中导入所需的依赖: ```javascript import { createApp } from 'vue' import ElementPlus from 'element-plus' import 'element-plus/lib/theme-chalk/index.css' import jsPlumb from 'jsplumb' import { createPinia } from 'pinia' import Sortable from 'sortablejs' import App from './App.vue' const app = createApp(App) app.use(ElementPlus) app.use(createPinia()) app.config.globalProperties.$jsPlumb = jsPlumb app.config.globalProperties.$Sortable = Sortable app.mount('#app') ``` 接着,你需要在 `App.vue` 中创建一个流程图组件: ```html <template> <div class="container"> <div class="sidebar"> <div class="item" @click="addNode">Add Node</div> <div class="item" @click="deleteNode">Delete Node</div> </div> <div class="main"> <div class="canvas" ref="canvas"></div> </div> </div> </template> <script> import { ref, onMounted } from 'vue' export default { name: 'App', setup() { const canvasRef = ref(null) const jsPlumbInstance = ref(null) const addNode = () => { // 添加节点 } const deleteNode = () => { // 删除节点 } onMounted(() => { // 初始化 jsPlumb jsPlumbInstance.value = $jsPlumb.getInstance({ Container: canvasRef.value, Connector: ['Bezier', { curviness: 150 }], Endpoint: ['Dot', { radius: 5 }], EndpointStyle: { fill: '#456' }, PaintStyle: { stroke: '#456', strokeWidth: 2 }, DragOptions: { cursor: 'pointer', zIndex: 2000 }, ConnectionOverlays: [ ['Arrow', { location: 1, width: 10, length: 10 }], ['Label', { label: 'FOO', id: 'label', cssClass: 'label' }], ], }) // 添加初始节点 const node = document.createElement('div') node.classList.add('node') node.setAttribute('id', 'node1') node.textContent = 'Node 1' canvasRef.value.appendChild(node) // 添加节点拖拽事件 $Sortable.create(canvasRef.value, { draggable: '.node', onEnd: (evt) => { const node = evt.item const nodeId = node.getAttribute('id') // 更新节点位置 const position = jsPlumbInstance.value.getOffset(node) const newPosition = { x: position.left, y: position.top, } // 更新节点位置到状态管理库中 }, }) }) return { canvasRef, addNode, deleteNode, } }, } </script> <style> .container { display: flex; height: 100vh; } .sidebar { width: 200px; height: 100%; background-color: #f0f0f0; display: flex; flex-direction: column; justify-content: center; align-items: center; } .main { flex: 1; height: 100%; display: flex; justify-content: center; align-items: center; } .canvas { width: 800px; height: 600px; background-color: #fff; border: 1px solid #ccc; } </style> ``` 在上面的代码中,我们使用了 `jsPlumb` 创建了一个流程图,并使用 `sortablejs` 实现了节点的拖拽和排序。我们还将节点的位置信息保存到了状态管理库中,以便在需要时进行使用。 最后,你需要在你的应用程序中添加更多的功能,例如添加连接线、删除连接线、编辑节点等等。你可以在 `jsPlumb` 的官方文档中找到更多的示例和用法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值