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

Einführung und detaillierte Verwendung von React Fragment

Inhaltsverzeichnis Vorwort Motivation für Fragmen...

So fügen Sie CentOS7 systemd benutzerdefinierte Systemdienste hinzu

systemd: Das Service-Systemctl-Skript von CentOS ...

Detaillierte Erklärung der Verwendung von SetUp- und Reactive-Funktionen in Vue3

1. Wann soll setUp ausgeführt werden? Wir alle wi...

Klassischer Beispielcode für JavaScript-Funktionsaufrufe

Inhaltsverzeichnis Klassisches Beispiel für einen...

Anwendungsbeispiele für den Mysql Inner Join (unbedingt lesen)

Grammatikregeln SELECT Spaltenname(n) FROM Tabell...

MySQL-Datenmigration mit dem Befehl MySQLdump

Die Vorteile dieser Lösung liegen in der Einfachh...

So installieren Sie Android x86 in einer virtuellen VMware-Maschine

Manchmal möchten Sie eine App testen, aber nicht ...

CSS implementiert die Bottom-Tapbar-Funktion

Viele Mobiltelefone verfügen mittlerweile über di...

So fragen Sie Daten aus mehreren unabhängigen Tabellen und Paging in MySQL ab

Mysql mehrere unabhängige Tabellen Abfragedaten u...

Detaillierte Beispiele zur Float-Verwendung in HTML/CSS

1. Grundlegende Anwendungsbeispiele für Float 1. ...

Implementierung der virtuellen React-Liste

Inhaltsverzeichnis 1. Hintergrund 2. Was ist eine...