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
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 Die Ereignisse des Zielelements sind wie folgt: 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. KomponentenSchauen 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. 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:
|
<<: Eine Fallstudie zur MySQL-Optimierung
>>: Detaillierte Erklärung der Funktionsweise von Nginx
Inhaltsverzeichnis Vorwort Motivation für Fragmen...
Dieser Artikel veranschaulicht anhand von Beispie...
systemd: Das Service-Systemctl-Skript von CentOS ...
1. Laden Sie die erforderlichen Pakete herunter w...
1. Wann soll setUp ausgeführt werden? Wir alle wi...
Inhaltsverzeichnis Klassisches Beispiel für einen...
Grammatikregeln SELECT Spaltenname(n) FROM Tabell...
Die Vorteile dieser Lösung liegen in der Einfachh...
Manchmal möchten Sie eine App testen, aber nicht ...
Suchen Sie das Installationsverzeichnis von Virtu...
Viele Mobiltelefone verfügen mittlerweile über di...
Mysql mehrere unabhängige Tabellen Abfragedaten u...
1. Grundlegende Anwendungsbeispiele für Float 1. ...
Inhaltsverzeichnis 1. Hintergrund 2. Was ist eine...
Mit der zunehmenden Reife des Internetzeitalters ...