Lassen Sie uns heute darüber sprechen. Wenn das Backend tatsächlich 100.000 Daten an das Frontend zurückgibt, wie können wir sie dann elegant auf dem Frontend anzeigen? VorarbeitMachen Sie zuerst die Vorarbeit, dann können Sie es später testen. Backend-Konstruktion Erstellen Sie eine neue Wenn // server.js const http = erfordern('http'). konstanter Port = 8000; http.createServer(Funktion (Anforderung, Res) { // Cors aktivieren res.writeHead(200, { //Legen Sie den Domänennamen fest, der domänenübergreifend zulässig ist. Sie können auch * festlegen, um alle Domänennamen zuzulassen. 'Access-Control-Allow-Origin': '*', //Domänenübergreifend zulässige Anforderungsmethoden. Sie können * auch so festlegen, dass alle Methoden zulässig sind "Access-Control-Allow-Methods": "DELETE,PUT,POST,GET,OPTIONS", //Erlaubte Header-Typen 'Access-Control-Allow-Headers': 'Content-Type' }) lass Liste = [] sei num = 0 // Eine Liste mit 100.000 Datensätzen erstellen für (sei i = 0; i < 1000000; i++) { Zahl++ Liste.push({ Quelle: 'https://p3-passport.byteacctimg.com/img/user-avatar/d71c38d1682c543b33f8d716b3b734ca~300x300.image', Text: „Ich bin Gast Nummer ${num} Lin Sanxin“, tid: Nummer }) } res.end(JSON.stringify(Liste)); }).listen(Port, Funktion () { console.log('Server lauscht auf Port ' + Port); }) Frontend-Seite Erstellen Sie zunächst eine neue // index.html // Stil <Stil> * { Polsterung: 0; Rand: 0; } #Behälter { Höhe: 100vh; Überlauf: automatisch; } .Sonnenschein { Anzeige: Flex; Polsterung: 10px; } img { Breite: 150px; Höhe: 150px; } </Stil> // HTML-Teil <body> <div id="Behälter"> </div> <script src="./index.js"></script> </body> Erstellen Sie dann eine neue // index.js // Anforderungsfunktion const getList = () => { returniere neues Promise((lösen, ablehnen) => { //Schritt 1: Asynchrones Objekt erstellen var ajax = new XMLHttpRequest(); //Schritt 2: Legen Sie die Anforderungs-URL-Parameter fest. Parameter 1 ist der Anforderungstyp und Parameter 2 ist die Anforderungs-URL. Sie können ajax.open('get', 'http://127.0.0.1:8000'); verwenden. //Schritt 3: Anfrage senden ajax.send(); //Schritt 4: Registrieren Sie das Ereignis onreadystatechange. Wenn sich der Status ändert, ajax.onreadystatechange = function () { wenn (ajax.readyState == 4 und ajax.status == 200) { //Schritt 5 Wenn Sie bis zu diesem Punkt gelangen, bedeutet das, dass die Daten einwandfrei zurückgegeben werden und die angeforderte Seite existiert. resolve(JSON.parse(ajax.responseText)) } } }) } // Containerobjekt abrufen const container = document.getElementById('container') Direktes Rendering Der direkteste Weg ist das direkte Rendern, aber dieser Ansatz ist definitiv nicht ratsam, da das Rendern const renderList = async () => { console.time('Listenzeit') const list = warte auf getList() Liste.fürJeden(Element => { const div = Dokument.createElement('div') div.className = "Sonnenschein" div.innerHTML = `<img src="${item.src}" /><span>${item.text}</span>` container.anhängenKind(div) }) console.timeEnd('Listenzeit') } renderList() setTimeout Seitendarstellung Diese Methode besteht darin, const renderList = async () => { console.time('Listenzeit') const list = warte auf getList() console.log(Liste) const total = Liste.Länge Konstante Seite = 0 Konstantengrenze = 200 const totalPage = Math.ceil(Gesamt / Limit) const render = (Seite) => { if (Seite >= Gesamtseite) return setzeTimeout(() => { für (sei i = Seite * Limit; i < Seite * Limit + Limit; i++) { const Element = Liste[i] const div = Dokument.createElement('div') div.className = "Sonnenschein" div.innerHTML = `<img src="${item.src}" /><span>${item.text}</span>` container.anhängenKind(div) } rendern(Seite + 1) }, 0) } rendern(Seite) console.timeEnd('Listenzeit') } AnfrageAnimationFrame Die Verwendung const renderList = async () => { console.time('Listenzeit') const list = warte auf getList() console.log(Liste) const total = Liste.Länge Konstante Seite = 0 Konstantengrenze = 200 const totalPage = Math.ceil(Gesamt / Limit) const render = (Seite) => { if (Seite >= Gesamtseite) return // Verwenden Sie requestAnimationFrame anstelle von setTimeout requestAnimationFrame(() => { für (sei i = Seite * Limit; i < Seite * Limit + Limit; i++) { const Element = Liste[i] const div = Dokument.createElement('div') div.className = "Sonnenschein" div.innerHTML = `<img src="${item.src}" /><span>${item.text}</span>` container.anhängenKind(div) } rendern(Seite + 1) }, 0) } rendern(Seite) console.timeEnd('Listenzeit') } Dokumentfragmente + requestAnimationFrameVorteile der Dokumentfragmentierung 1. Bisher wurde 2. Die Seite rendert nur die vom Dokumentfragment umschlossenen Elemente, nicht jedoch das Dokumentfragment selbst. const renderList = async () => { console.time('Listenzeit') const list = warte auf getList() console.log(Liste) const total = Liste.Länge Konstante Seite = 0 Konstantengrenze = 200 const totalPage = Math.ceil(Gesamt / Limit) const render = (Seite) => { if (Seite >= Gesamtseite) return requestAnimationFrame(() => { // Ein Dokumentfragment erstellen const fragment = document.createDocumentFragment() für (sei i = Seite * Limit; i < Seite * Limit + Limit; i++) { const Element = Liste[i] const div = Dokument.createElement('div') div.className = "Sonnenschein" div.innerHTML = `<img src="${item.src}" /><span>${item.text}</span>` // Zuerst das Dokumentfragment einfügen fragment.appendChild(div) } // Einmaliges appendChild container.appendChild(fragment) rendern(Seite + 1) }, 0) } rendern(Seite) console.timeEnd('Listenzeit') } Lazy Loading Für eine allgemeinere Erklärung starten wir ein Tatsächlich ist das Implementierungsprinzip sehr einfach. Lassen Sie es uns anhand eines Bildes zeigen. Setzen Sie am Ende der Liste einen leeren Knoten Um festzustellen, ob in der Ansicht <script setup lang="ts"> importiere { onMounted, ref, berechnet } von 'vue' const getList = () => { //Gleicher Code wie oben} const container = ref<HTMLElement>() // Containerknoten const blank = ref<HTMLElement>() // leerer Knoten const list = ref<any>([]) // Liste const page = ref(1) // aktuelle Seitenzahl const limit = 200 // Anzeige einer Seite // maximale Seitenzahl const maxPage = computed(() => Math.ceil(list.value.length / limit)) // Die tatsächlich angezeigte Liste const showList = computed(() => list.value.slice(0, page.value * limit)) const handleScroll = () => { // Vergleich der aktuellen Seitenzahl und der maximalen Seitenzahl if (page.value > maxPage.value) return const clientHeight = container.Wert?.clientHeight const blankTop = blank.Wert?.getBoundingClientRect().top wenn (Clienthöhe === blankTop) { // In der Ansicht erscheint ein Leerzeichen, die aktuelle Seitenzahl wird um 1 erhöht Seite.Wert++ } } beimMounted(async () => { const res = warte auf getList() Liste.Wert = Res }) </Skript> <Vorlage> <div Klasse="Container" @scroll="handleScroll" ref="Container"> <div Klasse="Sonnenschein" v-for="(Artikel) in ShowList" :key="Artikel.tid"> <img :src="item.src" /> <span>{{ Artikel.text }}</span> </div> <div ref="blank"></div> </div> </Vorlage> Oben sind die Details, wie das Front-End die 100.000 Daten, die vom Back-End zurückgegeben werden, besser anzeigen kann. Weitere Informationen zur Anzeige der 100.000 Daten, die vom Back-End zurückgegeben werden, durch das Front-End finden Sie in den anderen verwandten Artikeln auf 123WORDPRESS.COM! Das könnte Sie auch interessieren:
|
>>: Zusammenfassung der Zeilenumbruchprobleme bei Textbereichen in HTML
Nach drei Tagen voller Schwierigkeiten habe ich d...
XHTML definiert drei Dokumenttypdeklarationen. Am...
Manchmal müssen Sie basierend auf der offiziell v...
In diesem Artikel wird der spezifische JavaScript...
Einführung: Im Internet gibt es zahlreiche Inform...
Als mir diese Frage gestellt wurde, war ich unwis...
Beim Starten von MySQL in einer OS X-Umgebung wir...
1. Traditionelle Binlog-Master-Slave-Replikation,...
1. Was sind die Vorlagen für ASP.NET-Webanwendunge...
Ich habe vor Kurzem VMware Horizon bereitgestellt...
Inhaltsverzeichnis Namespaces mit gleichem Namen ...
Vorwort Wenn Sie jemand fragt: „Was sind die Merk...
Dieser Artikel fasst hauptsächlich verschiedene P...
Das im Projekt aufgetretene Layoutproblem unregel...
Standort / { Index Index.jsp; Proxy_next_upstream...