Home > Web Front-end > Vue.js > body text

How to use Vue to implement drag-and-drop upload effects

WBOY
Release: 2023-09-19 13:21:17
Original
1409 people have browsed it

How to use Vue to implement drag-and-drop upload effects

How to use Vue to implement drag-and-drop upload effects

Introduction:
With the rapid development of the Internet, uploading and downloading files has become an indispensable part of our daily lives. A missing part. As front-end developers, we need to provide users with a friendly and practical upload function. This article will introduce how to use the Vue framework to implement a drag-and-drop upload effect, allowing users to easily drag files onto the page for upload.

Part One: Preparation
First, we need to create a Vue project. You can use Vue CLI to quickly build a basic project structure. After installing the Vue CLI, execute the following command on the command line:

vue create drag-upload
cd drag-upload
npm run serve
Copy after login

This creates a Vue project named drag-upload and runs it on the local development server.

Part 2: Implement drag-and-drop upload function

  1. Component creation
    Create a single-file component named DragUpload.vue in the src/components directory:

    <template>
      <div class="drag-upload">
     <div :class="['drag-area', dragClass]" @drop="dropHandler" @dragover.prevent="dragoverHandler" @dragenter.prevent="dragenterHandler" @dragleave="dragleaveHandler">
       <input type="file" ref="inputFile" @change="fileChangeHandler($event)" style="display: none;">
       <span class="drag-text">{{ dragText }}</span>
     </div>
     <div v-if="file" class="file-info">
       <span>文件名: {{ file.name }}</span>
       <span>文件大小: {{ formatFileSize(file.size) }}</span>
       <span>文件类型: {{ file.type }}</span>
       <button @click="uploadFile">上传</button>
     </div>
      </div>
    </template>
    
    <script>
    export default {
      data() {
     return {
       dragClass: '',
       dragText: '将文件拖到此处上传',
       file: null
     }
      },
      methods: {
     dragoverHandler(event) {
       this.dragClass = 'dragover'
       event.preventDefault()
     },
     dragenterHandler(event) {
       this.dragClass = 'dragover'
       event.preventDefault()
     },
     dragleaveHandler(event) {
       this.dragClass = ''
       event.preventDefault()
     },
     dropHandler(event) {
       this.dragClass = ''
       event.preventDefault()
       this.file = event.dataTransfer.files[0]
     },
     fileChangeHandler(event) {
       this.file = event.target.files[0]
     },
     formatFileSize(size) {
       if (size < 1024) {
         return size + 'B'
       } else if (size < 1048576) {
         return (size / 1024).toFixed(2) + 'KB'
       } else if (size < 1073741824) {
         return (size / 1048576).toFixed(2) + 'MB'
       } else {
         return (size / 1073741824).toFixed(2) + 'GB'
       }
     },
     uploadFile() {
       // 上传文件逻辑
     }
      }
    }
    </script>
    
    <style scoped>
    .drag-upload {
      max-width: 400px;
      margin: 20px auto;
      padding: 20px;
      border: 2px dashed #ccc;
      text-align: center;
    }
    
    .drag-area {
      padding: 40px;
      transition: background-color 0.2s;
    }
    
    .drag-text {
      font-size: 16px;
    }
    
    .dragover {
      background-color: #eee;
    }
    
    .file-info {
      margin-top: 20px;
    }
    
    .file-info > * {
      display: block;
      margin-bottom: 10px;
    }
    
    button {
      padding: 8px 16px;
      background-color: #42b983;
      color: #fff;
      border: none;
      cursor: pointer;
    }
    </style>
    Copy after login
  2. Using components
    Use the DragUpload component in App.vue:

    <template>
      <div id="app">
     <DragUpload></DragUpload>
      </div>
    </template>
    
    <script>
    import DragUpload from './components/DragUpload.vue'
    
    export default {
      components: {
     DragUpload
      }
    }
    </script>
    Copy after login

    So far, we have completed the implementation of a basic drag-and-drop upload component. Users can drag files into the area at the top of the page, and file-related information and upload buttons are displayed.

Part 3: Implement file upload logic
In the uploadFile method of DragUpload.vue, we can use tools such as Axios or Fetch to upload files to the server:

uploadFile() {
  let formData = new FormData()
  formData.append('file', this.file)
  
  // 使用Axios进行文件上传
  axios.post('/api/upload', formData).then(response => {
    console.log(response.data)
  }).catch(error => {
    console.error(error)
  })
  
  // 使用Fetch进行文件上传
  fetch('/api/upload', {
    method: 'POST',
    body: formData
  }).then(response => {
    console.log(response.json())
  }).catch(error => {
    console.error(error)
  })
}
Copy after login

In the above code, we encapsulate the file using the FormData object and upload the file to the server's '/api/upload' interface through a POST request. In the success and failure callback functions, you can perform corresponding operations based on the results returned by the interface.

Conclusion:
Through the above steps, we successfully implemented a drag-and-drop uploading special effect. Users can easily drag and drop files onto the page for uploading, and relevant information about the files can be displayed. At the same time, we also implemented the logic of file upload and uploaded the file to the server. I hope this article can help you, welcome to explore more about the features and usage of the Vue framework.

The above is the detailed content of How to use Vue to implement drag-and-drop upload effects. For more information, please follow other related articles on the PHP Chinese website!

source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template