Vue implementiert Upload-Komponente

Vue implementiert Upload-Komponente

1. Einleitung

Die Wirkung ist wie folgt

2. Ideen

Zwei Möglichkeiten zum Hochladen von Dateien

1. Aus dem Formular

<Formular 
  Methode="posten" 
  enctype="multipart/aus-daten"
  Aktion="API/Hochladen"
>
  <input type="Dateiname="Datei">
  <button type="submit">Senden</button>
</form>

Das method-Attribut von form gibt eine „post“-Anforderung an, die Daten über ein HTML-Formular an den Server sendet und das geänderte Ergebnis des Servers zurückgibt. In diesem Fall wird der Content-Type durch Setzen des richtigen enctype-Attributs im <form>-Element festgelegt.

Das enctype-Attribut des Formulars gibt an, wie die Formulardaten codiert werden sollen, bevor sie an den Server gesendet werden.

  • application/x-www-form-urlencoded (Standard): bedeutet, dass alle Zeichen vor dem Senden codiert werden. Die Daten werden in durch "&" getrennte Schlüssel-Wert-Paare codiert, und Schlüssel und Wert werden durch "=" getrennt ("name=seven&age=19"). Binärdaten werden nicht unterstützt.
  • multipart/form-data: unterstützt Binärdaten (müssen beim Hochladen von Dateien angegeben werden)

2. Asynchrones Anforderungsformular in JavaScript

Wir wissen, dass die FormData-Schnittstelle eine Möglichkeit bietet, Schlüssel/Wert-Paare zu konstruieren, die Formulardaten darstellen, und Daten problemlos über die Methode XMLHttpRequest.send() senden kann. Diese Schnittstelle und diese Methode sind recht einfach und direkt. Wenn die ausgehende Kodierung auf „multipart/form-data“ eingestellt ist, wird dasselbe Format wie das Formular verwendet.

var formdata = new FormData(); // Ein FormData-Objekt erstellen formdata.append("name","laotie"); // Neue Attributwerte über die Methode append() hinzufügen... // Für weitere Methoden klicken Sie bitte auf den Link unten

FormData-Schnittstelle

3. Lebenszyklus

Auch die Upload-Komponente hat ihren Lebenszyklus

beforeUpload --> hochladen --> fileUploaded oder uploadedError

4. Code-Entwurf

In diesem Beispiel wird die Upload-Komponente mithilfe einer asynchronen JS-Anforderung entwickelt.

<input type="Datei" name="Datei" @change.prevent="handleFileChange">
// Erstellen Sie eine Eingabe vom Typ „Datei“, um den Dateiupload auszulösen. Sie können die Eingabe später ausblenden und den Stil anpassen. // Wenn Sie den Stil anpassen, können Sie mithilfe von „slot“ die Stile verschiedener Upload-Zustände (Laden, Erfolg, Standard) unterscheiden.
const handleFileChange = (e:Ereignis)=>{
  const target = e.target als HTMLInputElement
  const files = Array.from(target.files)// Beachten Sie, dass hier ein Klassenarray erhalten wird if(files){
    // Datei abrufen const uploadedFile = files[0]
    
    if(!validateFormat) return
    // … Dies ist nur eine Denkweise und die spezifische Überprüfung wird hier nicht beschrieben. // Führen Sie vor dem Hochladen der Datei einige Überprüfungen durch, z. B. Dateiformat, Größe usw.
    // Wenn die Anforderungen nicht erfüllt sind, werden keine weiteren Anfragen gesendet const formData = new FormData()
    formData.append(hochgeladeneDatei.name,hochgeladeneDatei)
    
    axios.post('/hochladen',formData,{
      Überschriften:{
         // Hinweis zum Festlegen des Kodierungstyps „Content-Type“: „multipart/form-data“
      }
    }).dann(res=>{
      console.log('Hochladen erfolgreich')
    }).fangen(Fehler =>{
      // Dateiupload fehlgeschlagen}).finally(()=>{
      // Dateiupload abgeschlossen, egal ob erfolgreich oder fehlgeschlagen // Hier kannst du input.value löschen
    })
  }
}

5. Konkrete Umsetzung

// Hochladen.vue
<Vorlage>
  <div Klasse="Upload-Container">
    <div Klasse="upload-box" @click.prevent="triggerUpload" v-bind="$attrs">
      <slot name="wird geladen" v-if="fileStatus==='wird geladen'">
        <button class="btn btn-primary">Hochladen</button>
      </slot>
      <slot name="hochgeladen" v-else-if="fileStatus==='success'" :uploadedData="fileData">
        <button class="btn btn-primary">Hochladen erfolgreich</button>
      </slot>
      <slot v-else name="default">
        <button class="btn btn-primary">Zum Hochladen klicken</button>
      </slot>
    </div>
    <input Typ="Datei" Klasse="file-input d-none" Name="Datei" ref="uploadInput" @change="hanldeInput"/>
  </div>
</Vorlage>
<script lang="ts">
importiere { defineComponent, ref, PropType, watch } von 'vue'
Axios von „Axios“ importieren
Typ UploadStatus = ‚bereit‘ | ‚wird geladen‘ | ‚Erfolgreich‘ | ‚Fehler‘
Typ FunctionProps = (Datei:Datei) => Boolesch
exportiere StandarddefiniereKomponente({
  Name: 'Hochladen',
  inheritAttrs: false,
  Requisiten: {
    // URL hochladen
    Aktion: {
      Typ: Zeichenfolge,
      erforderlich: true
    },
    // Überprüfung vor dem Hochladen, eine Funktion die einen Booleschen Wert zurückgibt beforeUpload: {
      Typ: Funktion als PropType<FunctionProps>
    },
    // Hochgeladene Daten, die verwendet werden, um den Status zu bestimmen oder die Anzeige zu initialisieren uploadedData: {
      Typ: Objekt
    }
  },
  gibt aus: ['Datei-Upload erfolgreich', 'Datei-Upload-Fehler'],
  setup(Eigenschaften, ctx) {
    const uploadInput = ref<null | HTMLInputElement>(null)
    const fileStatus = ref<UploadStatus>(props.uploadedData ? 'Erfolg' : 'Bereit')
    const fileData = ref(props.uploadedData)
    beobachten(() => Eigenschaften.uploadedData, (Wert) => {
      wenn (Wert) {
        fileStatus.value = "Erfolg"
        fileData.value = val
      }
    })
    const triggerUpload = () => {
      wenn (uploadInput.value) {
        uploadInput.value.click()
      }
    }
    const hanldeInput = (e:Ereignis) => {
      const target = e.target als HTMLInputElement
      const Dateien = Zieldateien
      console.log(Ziel)
      if (Dateien) {
        const uploadFile = Array.from(Dateien)
        const validateFormat = props.beforeUpload ? props.beforeUpload(uploadFile[0]) : true
        if (!validateFormat) return
        fileStatus.value = "wird geladen"
        const formData = new FormData()
        formData.append('Datei', Upload-Datei[0])
        axios.post(Eigenschaften.Aktion, FormData, {
          Überschriften: {
            „Inhaltstyp“: „multipart/Formulardaten“
          }
        }).dann(res => {
          console.log('Datei erfolgreich hochgeladen', res)
          fileStatus.value = "Erfolg"
          Dateidatenwert = res.data
          ctx.emit('Datei erfolgreich hochgeladen', res.data)
        }).fangen(Fehler => {
          console.log('Dateiupload fehlgeschlagen', Fehler)
          fileStatus.value = "Fehler"
          ctx.emit('Datei-Upload-Fehler', Fehler)
        }).schließlich(() => {
          console.log('Dateiupload abgeschlossen')
          wenn (uploadInput.value) {
            uploadInput.Wert.Wert = ''
          }
        })
      }
    }

    zurückkehren {
      hochladenInput,
      Hochladen auslösen,
      griffInput,
      Dateistatus,
      DateiDaten
    }
  }
})
</Skript>

Anwendungsbeispiel:

<Vorlage>
  <div Klasse="Beitragsseite erstellen">
    <hochladen
      Aktion="/Hochladen"
      :beforeUpload="vor dem Hochladen"
      :uploadedData="hochgeladeneDaten"
      @file-uploaded-success="erfolgreich hochgeladen"
      Klasse = "d-flex align-items-center justify-content-center bg-light text-secondary w-100 my-4"
      >
      <Vorlage #uploaded="slotProps">
        <div Klasse="Hochgeladener Bereich">
          <img :src="slotProps.uploadedData.data.url"/>
          <h3>Klicken Sie hier, um es erneut hochzuladen</h3>
        </div>
       </Vorlage>
       <Vorlage #Standard>
         <h2>Klicken Sie hier, um das Kopfzeilenbild hochzuladen</h2>
       </Vorlage>
       <Vorlage #wird geladen>
         <div Klasse="d-flex">
          <div Klasse="spinner-border text-secondary" Rolle="status">
            <span class="sr-only"></span>
          </div>
         </div>
       </Vorlage>
    </hochladen>
  </div>
</Vorlage>
<script lang="ts">
importiere { defineComponent, ref, onMounted } von 'vue'
Upload von „../components/Upload.vue“ importieren
importiere createMessage aus '../components/createMessage'

exportiere StandarddefiniereKomponente({
  Name: 'CreatePost',
  Komponenten: {Hochladen},
  aufstellen() {
    const uploadedData = ref() //Erstellen Sie reaktionsfähige Daten let imageId = ''
    beimMounted(() => {
      ....
      // Die Logik wird hier weggelassen, holen Sie sich das Initialisierungsdatenbild
      wenn (Bild) {
        uploadedData.value = { Daten: Bild }
      }
    })
    // Vor dem Hochladen prüfen, Booleschen Wert zurückgeben const beforeUpload = (file:File) => {
      const res = vorUploadCheck(Datei, {
        Format: ['Bild/JPEG', 'Bild/PNG'],
        Größe: 1
      })
      const { Fehler, bestanden } = res
      wenn (Fehler === 'Format') {
        createMessage('Hochgeladene Bilder können nur im JPG/PNG-Format sein!', 'error')
      }
      if (Fehler === 'Größe') {
        createMessage('Die Größe des hochgeladenen Bildes darf 1 MB nicht überschreiten', 'Fehler')
      }
      Rückkehr bestanden
    }
    // Nachdem der Upload erfolgreich war, können Sie die ImageId für die nachfolgende Verarbeitung abrufen, z. B. zum Erstellen eines Formulars. const hanldeUploadSuccess = (res:ResponseProps<ImageProps>) => {
      createMessage(`Bild-ID ${res.data._id} hochladen`, 'erfolgreich')
      wenn (res.data._id) {
        Bild-ID = res.data._id
      }
    }
    zurückkehren {
      vor dem Hochladen,
      hanldeUploadErfolgreich,
      hochgeladeneDaten
    }
  }
})
</Skript>
<Stil>
.Beitragsseite erstellen{
  Polsterung: 0 20px 20px;
}
.Erstellen einer Beitragsseite .Upload-Box{
  Höhe: 200px;
  Cursor: Zeiger;
  Überlauf: versteckt;
}
.erstellen-post-page .upload-box img{
  Breite: 100 %;
  Höhe: 100%;
  Objekt-Passung: Abdeckung;
}
.hochgeladener Bereich{
  Position: relativ;
}
.hochgeladener Bereich:hover h3{
  Anzeige: Block;
}
.hochgeladener Bereich h3{
  Anzeige: keine;
  Position: absolut;
  Farbe: #999;
  Textausrichtung: zentriert;
  Breite: 100 %;
  oben: 50 %
}
</Stil>

Oben sind die Details der Implementierung der Upload-Komponente von Vue aufgeführt. Weitere Informationen zur Upload-Komponente von Vue finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM!

Das könnte Sie auch interessieren:
  • Die Komponente vue-cropper realisiert das Zuschneiden und Hochladen von Bildern
  • Das Vue-Cropper-Plugin realisiert die Kapselung der Bildaufnahme- und Upload-Komponente
  • Implementierung der Vue-Komponente zum Zuschneiden und Hochladen von Bildern
  • Vue3.0 mit .net-Core zur Implementierung einer Datei-Upload-Komponente
  • Vue-Beispiel für die Verwendung nativer Komponenten zum Hochladen von Bildern
  • Vue + Node.js + MongoDB-Bild-Upload-Komponente zum Implementieren von Bildvorschau- und Löschfunktionen
  • Detaillierte Erläuterung der Verwendung der Vue-Bild-Upload-Komponente
  • Verwenden Sie die ElementUI-Komponente in Vue, um Bilder manuell hochzuladen
  • Vue-Entwicklungspaket: Datei-Upload-Komponente und Verwendungsbeispiele
  • Detaillierte Erläuterung der Verwendung der lokalen Vorschaukomponente zum Hochladen von Vue-Bildern
  • Verwendung der Upload-Komponente „el-upload“ von vue-cli3.0+element-ui

<<:  Grafisches Tutorial zur Installation und Konfiguration von MySQL 8.0.13 unter Windows 64 Bit

>>:  CentOS 7.6 Installation der MySQL 5.7 GA-Version Tutorial-Diagramm

Artikel empfehlen

100-1% des Inhalts der Website ist Navigation

Website, (100-1)% des Inhalts ist Navigation 1. J...

So erstellen Sie ein CentOS-Basisimage

Vorwort Derzeit ist das von meiner Firma verwende...

Erläuterung zu JavaScript-Anti-Shake und -Throttling

Inhaltsverzeichnis Stabilisierung Drosselung Zusa...

Zusammenfassung der Wissenspunkte zum MySQL ALTER-Befehl

Wenn wir den Tabellennamen ändern oder die Tabell...

So löschen Sie schwebenden Beispielcode in CSS

Überblick Das Rahmendiagramm dieses Artikels ist ...

Beispielcode für horizontales Balkendiagramm von Echarts Bar

Inhaltsverzeichnis Horizontales Balkendiagramm Da...

Detaillierte Erklärung zum Einrichten eines DNS-Servers unter Linux

1. DNS-Server-Konzept Die Kommunikation im Intern...

So erstellen Sie ein Django-Projekt und stellen eine Verbindung zu MySQL her

1: django-admin.py startproject Projektname 2: CD...

Detaillierte Beschreibung des MySQL-Ersetzens in der Verwendung

Die Ersetzungsanweisung ähnelt im Allgemeinen der...

Der Unterschied zwischen Vue-Interpolationsausdruck und V-Text-Direktive

Inhaltsverzeichnis 1. Verwenden Sie Plugin-Ausdrü...

Entdecken Sie die Wahrheit hinter dem Neuladevorgang in Nginx

Der heutige Artikel stellt hauptsächlich den Neul...