Vollbild-Drag-Upload-Komponente basierend auf Vue3

Vollbild-Drag-Upload-Komponente basierend auf Vue3

In diesem Artikel wird hauptsächlich die Vollbild-Drag-Upload-Komponente auf Basis von Vue3 vorgestellt, die mit allen geteilt wird. Die Details sind wie folgt:

Wissenspunkte

  • Browser-Drag-API
  • Anfrage abrufen
  • vue3

Es ist eine lange Geschichte. Um es kurz zu machen, ich habe nur einige Beispiele für Drag-and-Drop-Sortierung mit der HTML5-Drag-API gemacht. Tatsächlich ist die Idee im Grunde dieselbe wie bei anderen Drag-and-Drop-Upload-Komponenten, bei denen ein Bereich zum Ziehen angegeben und dann die Datei gelesen und hochgeladen wird. Lassen Sie uns zuerst über die Drag-API sprechen, eine neue API in HTML5. Wenn Sie einem Element das Attribut draggable = true zuweisen, unterstützt das Element das Ziehen. Die Drag-Element-Ereignisse sind wie folgt

1. ondrag führt das Skript beim Ziehen eines Elements aus
2. ondragstart führt das Skript aus, wenn der Drag-Vorgang beginnt
3. ondragend führt das Skript aus, wenn der Drag-Vorgang beendet ist

Die Ereignisse des Zielelements sind wie folgt:
1. ondragover führt das Skript aus, wenn das Element über ein gültiges Drop-Ziel gezogen wird
2. ondragenter Führt ein Skript aus, wenn ein Element auf ein gültiges Drag-Ziel gezogen wird
3. ondragleave ist ein Skript, das ausgeführt wird, wenn ein Element ein gültiges Drag & Drop-Ziel verlässt
4. ondrop führt das Skript aus, wenn das gezogene Element abgelegt wird

Wir möchten beispielsweise das Ziehen des Körpers überwachen:

const ele = document.querySelector('body')
ele.addEventListener('dragenter', (e) => {
  // etwas tun
})

Und wenn wir das Standardereignis verhindern möchten, können wir e.preventDefault() verwenden.

Komponenten

Schauen wir uns zunächst den Effekt an. Zu diesem Zeitpunkt habe ich es so eingestellt, dass nur PNG und JPG hochgeladen werden

verwenden:

    <hochladen
      accept=".jpg,.png,.ico" // Dateityp festlegen @onChange="change" // Datei-Upload-Ereignis action="http://localhost:3001/upload" // Upload-Adresse: header="header" // Hochgeladener Header
      autoUpload //Ob automatisch hochgeladen werden soll name="file" //Name des hochgeladenen Felds @onSuccess="onSuccess" //Upload erfolgreicher Rückruf></upload>

Als ich zu Beginn das gezogene Element abrufen wollte, stellte ich fest, dass trotz des hinzugefügten Abhörereignisses immer noch ein neues Fenster zur Vorschau der Datei geöffnet wurde. Daher bestand unser erster Schritt darin, alle Standardereignisse zu deaktivieren.

// Standardmäßige Drag-Events deaktivieren Funktion disableDefaultEvents() {
  const doc = Dokument.Dokumentelement
  doc.addEventListener('dragleave', (e) => e.preventDefault()) //Wegziehendoc.addEventListener('drop', (e) => e.preventDefault()) //Ziehen und ablegendoc.addEventListener('dragenter', (e) => e.preventDefault()) //Hineinziehendoc.addEventListener('dragover', (e) => e.preventDefault()) //Hin- und herziehen}

Holen Sie sich das Stammelement direkt, um das Standardereignis des Ziehens zu verhindern

Im zweiten Schritt fügen wir die Ereignisse, die wir überwachen möchten, dem Body oder anderen Elementen hinzu. Dabei ist zu beachten, dass die Höhe des Bodys der Höhe des Fensters entsprechen muss, damit ein Ziehen im Vollbildmodus möglich ist. Beim Wegziehen müssen wir außerdem feststellen, ob die Datei aus dem Bereich herausgezogen wird.

Hier das Gesamturteil:

e.target.nodeName === 'HTML', dies wird verwendet, um zu bestimmen, ob das Stammelement HTML ist
e.target === e.explicitOriginalTarget Dies ist eine Firefox-spezifische API, die bestimmt, ob die Ziele der beiden auslösenden Ereignisse konsistent sind (!e.fromElement &&
        (z. B. ClientX <= 0 ||
          e.clientY <= 0 ||
          e.clientX >= Fenster.innereWidth ||
e.clientY >= window.innerHeight))

Damit lässt sich feststellen, wo sich die Maus gerade befindet, ob sie sich noch im Bereich befindet

// Initialisiere die Drag-Event-Funktion init() {
    // Holen Sie sich das Body-Element const ele = document.querySelector('body')
  // Ereignis hinzufügen // Drag & Drop ele.addEventListener('dragenter', () => {
    show.value = wahr
  })
  // Hier wird ermittelt ob die Maus weggezogen wirdele.addEventListener('dragleave', (e) => {
    Wenn (
      e.target.nodeName === 'HTML' ||
      e.Ziel === e.explicitOriginalZiel ||
      (!e.fromElement &&
        (z. B. ClientX <= 0 ||
          e.clientY <= 0 ||
          e.clientX >= Fenster.innereWidth ||
          e.clientY >= window.innerHeight))
    ) {
      show.value = falsch
    }
  })
  //Ziehen Sie es hineinele.addEventListener('drop', (e) => {
    show.value = falsch
    e.preventDefault()
    onDrop(e) // Methode zum Ziehen und Verarbeiten von Dateien})
}

Der dritte Schritt besteht darin, die gezogene Datei zu verarbeiten. Zu diesem Zeitpunkt ist „accept“ der von uns definierte Dateityp. Zu diesem Zeitpunkt können wir die Eigenschaft e.dataTransfer.files verwenden, um die gezogene Datei abzurufen.
Dann verwenden wir den Filter, um die Dateien zu filtern, die wir hineingezogen haben, und behalten nur die Dateitypen, die wir brauchen

checkType(file,accept) wird verwendet, um den Dateityp zu bestimmen. Diese Funktion basiert auf dem Filter der Upload-Komponente im Element UI. Ich war auch verwirrt, als ich es geschrieben habe.

// Dateityp prüfen Funktion checkType(file, accept = '') {
  const { Typ, Name } = Datei
  wenn (akzeptieren.Länge === 0) true zurückgeben
  const Erweiterung = name.indexOf('.') > -1 ? `.${name.split('.').pop()}` : ''
  const baseType = Typ.replace(/\/.*$/, '')
  zurücknehmen
    .Teilt(',')
    .map((Typ) => Typ.trim())
    .filter((Typ) => Typ)
    .some((akzeptierterTyp) => {
      wenn (/\..+$/.test(akzeptierterTyp)) {
        Rückgabeerweiterung === akzeptierter Typ
      }
      wenn (/\/\*$/.test(akzeptierterTyp)) {
        return Basistyp === akzeptierter Typ.replace(/\/\*$/, '')
      }
      wenn (/^[^/]+\/[^/]+$/.test(akzeptierterTyp)) {
        Rückgabetyp === akzeptierter Typ
      }
    })
}

Mit dieser Methode wird die Datei nach dem Einziehen verarbeitet. Wenn wir die erforderliche Datei erhalten, verwenden wir „autoUpload“, um zu bestimmen, ob sie hochgeladen werden soll.

Funktion onDrop(e) {
  const akzeptieren = props.accept
  const list = [].slice.call(e.dataTransfer.files).filter((Datei) => {
    wenn (akzeptieren) {
      returniere checkType(Datei, akzeptieren)
    }
    returniere wahr
  })
  Dateiliste = Liste.map((p) => {
    Rückgabewert handleStart(p)
  })
  // Ereignis beiÄnderung() auslösen
  wenn (props.autoUpload) {
    wenn (Eigenschaften.Aktion === '') {
      beiFehler()
      werfen Sie "brauchen Aktion"
      zurückkehren
    }
    list.forEach((Datei) => {
      post(file) // Datei hochladen })
  }
}

Der Quellcode lautet wie folgt:

<Vorlage>
  <div Klasse="Maske" v-show="Anzeige" id="Maske">
    <h3>Zum Hochladen hierher ziehen</h3>
  </div>
</Vorlage>
<Skript-Setup>
importiere { ref, reaktiv, onMounted } von 'vue'
// Ajax aus „./ajax“ importieren
const props = defineProps({
  Name: String, // hochgeladener Feldname Header: { Object, Number, String }, // hochgeladener Dateiheader // zu prüfender Dateityp, wenn ein Wert vorhanden ist, werden nur alle Dateien hineingezogen und nur die Dateien nach der Filtereinstellung bleiben erhalten Akzeptieren: {
    Typ: Zeichenfolge,
    Standard: '',
  },
  // Ob der automatische Upload aktiviert werden soll autoUpload: {
    Typ: Boolean,
    Standard: false,
  },
  // Aktion zum Hochladen der Adresse: {
    Typ: Zeichenfolge,
    Standard: '#',
  },
})

const emit = defineEmits(['onError', 'onProgress', 'onSuccess', 'onChange']) // Standard-Emit-Ereignis let show = ref(false) // ob die Maske angezeigt werden soll let fileList = reactive([]) // Dateiliste let tempIndex = 0 // Markierung setzen onMounted(() => {
  disableDefaultEvents()
  init()
})
// Initialisiere die Drag-Event-Funktion init() {
  const ele = document.querySelector('body')
  ele.addEventListener('dragenter', () => {
    show.value = wahr
  }) //Ziehen und Ablegenele.addEventListener('dragleave', (e) => {
    Wenn (
      e.target.nodeName === 'HTML' ||
      e.Ziel === e.explicitOriginalZiel ||
      (!e.fromElement &&
        (z. B. ClientX <= 0 ||
          e.clientY <= 0 ||
          e.clientX >= Fenster.innereWidth ||
          e.clientY >= window.innerHeight))
    ) {
      show.value = falsch
    }
  }) //Wegziehenele.addEventListener('drop', (e) => {
    show.value = falsch
    e.preventDefault()
    beim Ablegen(e)
  }) // reinziehen }
// Standardmäßige Drag-Events deaktivieren Funktion disableDefaultEvents() {
  const doc = Dokument.Dokumentelement
  doc.addEventListener('dragleave', (e) => e.preventDefault()) //Wegziehendoc.addEventListener('drop', (e) => e.preventDefault()) //Ziehen und ablegendoc.addEventListener('dragenter', (e) => e.preventDefault()) //Hineinziehendoc.addEventListener('dragover', (e) => e.preventDefault()) //Hin- und herziehen}
//Drag-In-Ereignisfunktion onDrop(e) {
  const akzeptieren = props.accept
  const list = [].slice.call(e.dataTransfer.files).filter((Datei) => {
    wenn (akzeptieren) {
      returniere checkType(Datei, akzeptieren)
    }
    returniere wahr
  })
  Dateiliste = Liste.map((p) => {
    Rückgabewert handleStart(p)
  })
  beiÄnderung()
  wenn (props.autoUpload) {
    wenn (Eigenschaften.Aktion === '') {
      beiFehler()
      werfen Sie "brauchen Aktion"
      zurückkehren
    }
    list.forEach((Datei) => {
      post(Datei)
    })
  }
}
// Dateityp prüfen Funktion checkType(file, accept = '') {
  const { Typ, Name } = Datei
  wenn (akzeptieren.Länge === 0) true zurückgeben
  const Erweiterung = name.indexOf('.') > -1 ? `.${name.split('.').pop()}` : ''
  const baseType = Typ.replace(/\/.*$/, '')
  zurücknehmen
    .Teilt(',')
    .map((Typ) => Typ.trim())
    .filter((Typ) => Typ)
    .some((akzeptierterTyp) => {
      wenn (/\..+$/.test(akzeptierterTyp)) {
        Rückgabeerweiterung === akzeptierter Typ
      }
      wenn (/\/\*$/.test(akzeptierterTyp)) {
        return Basistyp === akzeptierter Typ.replace(/\/\*$/, '')
      }
      wenn (/^[^/]+\/[^/]+$/.test(akzeptierterTyp)) {
        Rückgabetyp === akzeptierter Typ
      }
    })
}
// Dateiliste verarbeiten Rückgabewert Funktion handleStart(rawFile) {
  rawFile.uid = Date.now() + tempIndex++
  zurückkehren {
    Status: 'bereit',
    Name: Rohdatei.name,
    Größe: rawFile.size,
    Prozentsatz: 0,
    uid: Rohdatei.uid,
    raw: Rohdatei,
  }
}
//Upload-Ereignisfunktion post(rawFile) {
  const Optionen = {
    Überschriften: props.header,
    Datei: rawFile,
    Daten: props.data || '',
    Dateiname: props.name || 'Datei',
    Aktion: Requisiten.Aktion,
  }
  hochladen (Optionen)
    .then((res) => {
      res.json()
    })
    .then((json) => {
      bei Erfolg(json, rawFile)
    })
    .catch((err) => {
      beiFehler(Fehler, Rohdatei)
    })
}
// Datei-Upload-Methode Funktion upload(option) {
  const Aktion = Option.Aktion

  const formData = new FormData()

  wenn (Option.Daten) {
    Objekt.Schlüssel(Option.Daten).fürJeden((Schlüssel) => {
      formData.append(Schlüssel, option.data[Schlüssel])
    })
  }
  formData.append(option.dateiname, option.datei, option.dateiname)

  const headers = neue Header()
  für (Element in Headern lassen) {
    wenn (headers.hasOwnProperty(item) && headers[item] !== null) {
      headers.append(i, option.headers[i])
    }
  }
  returniere fetch(Aktion, {
    Modus: „no-cors“,
    Textkörper: Formulardaten,
    Überschriften: Überschriften,
    Methode: 'post',
  })
}

// Zum Abrufen der Dateiliste ziehen. Ereignisfunktion onChange() {
  emittieren('beiÄnderung', Dateiliste)
}
//Hochladen des Ereignisses Funktion onProgress(e, file) {
  emit('onProgress', e, Datei, Dateiliste)
}
// Upload-Erfolgsereignisfunktion onSuccess(res, file) {
  emittieren('onProgress', res, Datei, Dateiliste)
}
// Upload fehlgeschlagen Ereignisfunktion onError() {
  emittieren('beiFehler')
}
</Skript>
<Stilbereich>
.Maske {
  oben: 0;
  unten: 0;
  rechts: 0;
  links: 0;
  Position: fest;
  Z-Index: 9999;
  Deckkraft: 0,6;
  Textausrichtung: zentriert;
  Hintergrund: #000;
}
h3 {
  Rand: -0,5em 0 0;
  Position: absolut;
  oben: 50 %;
  links: 0;
  rechts: 0;
  -webkit-transform: übersetzeY(-50%);
  -ms-transform: übersetzenY(-50%);
  transformieren: verschiebeY(-50%);
  Schriftgröße: 40px;
  Farbe: #fff;
  Polsterung: 0;
}
</Stil>

Dies ist das Ende dieses Artikels über die Drag & Drop-Upload-Komponente im Vollbildmodus basierend auf Vue3. Weitere relevante Inhalte zum Drag & Drop-Upload im Vollbildmodus von Vue3 finden Sie in früheren Artikeln auf 123WORDPRESS.COM oder in den folgenden verwandten Artikeln. Ich hoffe, dass jeder 123WORDPRESS.COM in Zukunft unterstützen wird!

Das könnte Sie auch interessieren:
  • Vue3.0 verwendet das Plug-In vue-grid-layout, um Drag-Layout zu implementieren

<<:  Eine Fallstudie zur MySQL-Optimierung

>>:  Detaillierte Erklärung der Funktionsweise von Nginx

Artikel empfehlen

Beispiel einer Vorrendering-Methode für eine Vue-Einzelseitenanwendung

Inhaltsverzeichnis Vorwort vue-cli 2.0 Version vu...

Codebeispiel für die Verwendung der MySql COALESCE-Funktion

COALESCE ist eine Funktion, die sich nacheinander...

6 Möglichkeiten, die von Linux-Prozessen belegten Portnummern anzuzeigen

Für Linux-Systemadministratoren ist es von entsch...

In einem Artikel erfahren Sie, wie Sie mit js den Sperrfeuereffekt erzielen

Inhaltsverzeichnis Erstellen Sie eine neue HTML-D...

CSS3-Kategoriemenüeffekt

Die CSS3-Kategoriemenüeffekte sind wie folgt: HTM...

Was sind die Dateiattribute von crw, brw, lrw usw. in Linux?

Was ist eine Datei? Eigentlich sind alle Dateien ...

Docker-Datenverwaltung und Netzwerkkommunikationsnutzung

Sie können Docker installieren und einfache Vorgä...

Einführung in die Funktionen und Verwendung von Wert- und Namensattributen in HTML

1. Der in der Schaltfläche verwendete Wert bezieht...

Der Unterschied und die Einführung von ARGB, RGB und RGBA

ARGB ist ein Farbmodus, also der RGB-Farbmodus mi...

Docker startet Redis und legt das Passwort fest

Redis verwendet das Apline-Image (Alps) von Redis...