Das WeChat-Applet „Scroll-View“ implementiert eine Lösung zum doppelten Laden von Daten beim Hochziehen

Das WeChat-Applet „Scroll-View“ implementiert eine Lösung zum doppelten Laden von Daten beim Hochziehen

In der Scroll-Ansicht des WeChat-Applets treten beim Hochziehen zum Laden häufiger Fehler auf (es werden zu viele Daten geladen und es können sogar doppelte Daten vorhanden sein).

Problembeschreibung: Einmaliges Hochziehen löst die Bottoming-Funktion onReachBottom() mehrere Male aus. Beim Wechsel zu einer benutzerdefinierten „Weitere laden“-Funktion wie loadMore() besteht das Problem weiterhin.

Produktionsumgebung: Dieses Problem besteht weiterhin in der neuesten Version 1.9.94 der Debugging-Basisbibliothek.

Lösung: Fügen Sie Zustandskontrollvariablen hinzu, um die Auslösebedingungen der Bottoming-Funktion bzw. das Laden weiterer Funktionen einzuschränken.

Nach dem Hochladen der Seite werden weitere Daten geladen. Im Bild unten sehen Sie, dass es doppelte Daten gibt.

Allgemeiner Front-End-WXML-Code search.wxml

<!--pages/shop/search.wxml-->
<scroll-view scroll-y="true" style="height:{{windowHeight}}px;" bindscrolltolower="onReachBottom">

      <!-- Produktliste -->
      <Ansichtsklasse="flex-wrp">
         <block wx:for="{{items}}">
            <view bindtap="onItemClick" class="item-box" data-iid="{{item.id}}"> 
               <image class="item-pic" src="{{item.thumb}}" mode="aspectFill"></image>
               <Klasse anzeigen="item-info">
                  <view class='item-name'>{{item.name}}</view>
                  <Ansichtsklasse='Verkaufspreis-Box'>
                     <text class='aktueller Preis'>¥{{item.aktueller_Preis}}</text>
                     <text class='item-sold'><text class='sold-title'>Verkaufsvolumen</text> {{item.sold_num}}</text> 
                  </Ansicht>
               </Ansicht>
            </Ansicht> 
         </block> 
      </Ansicht>
      <view wx:if="{{pageEnd==true}}" class='scrollEnd'>Alle Daten wurden angezeigt...</view>
</scroll-ansicht>

Erster Blick auf Testfall 1 search.js (nicht behobener Fehler)

//seiten/shop/public/search/search.js
/* JS-Anwendungsfall mit BUG */

const app = getApp();
var page = 0; //Seiten-Tag Page({
   Daten: {
      pageEnd:false, //Ist das das untere Ende der Seite? windowHeight: app.getWH(), //Anwendungshöhe // Produktlisten-Array-Elemente:[],
   },

   /***************************** System- und Seitenfunktion *************************/
   //Seite wird geladen onLoad: Funktion (Optionen) {
      //Laden Sie zuerst this.getServerItems(page);
   },
   // Bottom-Touch-Funktion (nach oben ziehen, um mehr zu laden)
   onReachBottom: Funktion () {
      this.getServerItems(Seite);
   },

   /************************* Netzwerkanfrage************************/
   /**
    * Holen Sie sich die Server-Produktliste * @param {string} page paging default 0
    */
   getServerItems: Funktion (Seite) {
      var tar = dies;
      //Standardwert festlegen pg = pg? pg: 0;
      wx.showLoading({//Toast anzeigen
         Titel: „Wird geladen …“,
      });
      //Netzwerkanfrage wx.request({
         URL: "https://xxx.com/api/items/search",
         Daten: {Seite: pg},
         Methode: 'POST',
         Header: { 'Inhaltstyp': 'Anwendung/x-www-form-urlencoded' },
         Erfolg: Funktion (res) {//Netzwerkanforderung erfolgreich, wenn (res.data.status == 1) {//Es gibt neue Daten, var tmpArr = res.data.data;
               arr = arr.concat(tmpArr);
               tar.setData({
                  Artikel: arr,
               });
               Seite++;

            } sonst {//res.data.status == 0 Keine neuen Daten tar.setData({
                  pageEnd:true, //Informationen am Seitenende anzeigen})
            }

         },
         Fehler: Funktion (e) {//Netzwerkanforderung fehlgeschlagen console.log(e);
         },
         abgeschlossen: function(c){//Netzwerkanforderung abgeschlossen wx.hideLoading();//Toast ausblenden
         }
      })

   },

Beheben Sie den Fehler und fügen Sie die untere Funktionssteuervariable canUseReachBottom zur obigen search.js hinzu

//seiten/shop/public/search/search.js
/* JS-Anwendungsfall nach der Behebung des BUG*/

const app = getApp();
var Seite = 0;
/* ------------------------- */
var canUseReachBottom = true; //Steuervariable für die Touch-Funktion unten /* ------------------------- */
Seite({
   Daten: {
      Seitenende:false, 
      Fensterhöhe: app.getWH(),
       Artikel:[],
   },
   onLoad: Funktion (Optionen) {
      this.getServerItems(Seite);
   },
   // Bottom-Touch-Funktion (nach oben ziehen, um mehr zu laden)
   onReachBottom: Funktion () {
      /* ------------------------- */
        if(!canUseReachBottom) return; //Wenn die Bottoming-Funktion nicht verfügbar ist, werden die Netzwerkanforderungsdaten nicht aufgerufen /* ------------------------- */
      this.getServerItems(Seite);
   },
   ServerItems: Funktion (pg) {
      /* ------------------------- */
        canUseReachBottom = false; //Bottom-Touch-Funktion schließen /* ------------------------- */
      var tar = dies;
      pg = pg? pg: 0;
      wx.showLoading({
         Titel: „Wird geladen …“,
      });
      wx.Anfrage({
         URL: "https://xxx.com/api/items/search",
         Daten: {Seite: pg},
         Methode: 'POST',
         Header: { 'Inhaltstyp': 'Anwendung/x-www-form-urlencoded' },
         Erfolg: Funktion (res) {
            if (res.data.status == 1) {//Es gibt neue Daten var tmpArr = res.data.data;
               arr = arr.concat(tmpArr);
               tar.setData({
                  Artikel: arr,
               });
               Seite++;
              /* ------------------------- */
                canUseReachBottom = true; //Es gibt neue Daten, die Bottoming-Funktion ist aktiviert und bereitet den nächsten Bottoming-Aufruf vor /* ------------------------- */
            } anders { 
               tar.setData({
                  Seitenende:true,
               })
            }

         },
         Fehler: Funktion (e) {
            konsole.log(e);
         },
         komplett: Funktion(c){
            wx.hideLoading();
         }
      })

   },

Zusammenfassung: Die Ursache des Fehlers kann darin liegen, dass nach dem Auslösen der Bottoming-Funktion Netzwerkdaten angefordert werden -> das Miniprogramm die Daten an das Frontend rendert. Da diese beiden Prozesse zeitaufwändig sind, hatte das Frontend keine Zeit, das Rendering abzuschließen, und die Bottoming-Funktion stellte fest, dass sich die Frontend-Seite immer noch am unteren Ende befand, und löste die Bottoming-Funktion erneut oder mehrmals aus. Dies führt zum wiederholten Laden von Daten.

Sie können es auch sehen, indem Sie sich die vConsole der Entwicklungsversion der mobilen App ansehen. Durch einmaliges Hochfahren werden drei nacheinander gestartete Netzwerkanforderungen ausgelöst. Anschließend gibt der Server die Erfolgsergebnisse verzögert nacheinander zurück. Wie in der Abbildung gezeigt:

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Beispiel für die Implementierung einer Pull-Up-Ladefunktion eines WeChat-Applets [Weitere Daten laden/Unten laden/Klicken, um weitere Daten zu laden]
  • So laden Sie echte Daten aus der Datenbank im WeChat-Applet
  • Verwenden von ECharts zum asynchronen Laden von Daten und Implementieren von Diagrammfunktionen im WeChat-Applet
  • So verwenden Sie ECharts zum asynchronen Laden von Daten im WeChat-Applet
  • Das WeChat-Applet implementiert einen Menüfolgeeffekt und schleifenförmig verschachtelte Ladedaten
  • Dateneffekt beim Laden des Schiebebildschirms der WeChat-Applet-Seite
  • Das WeChat-Applet wird zum Laden nach oben und zum Aktualisieren nach unten gezogen (onscrollLower) und lädt Daten stapelweise (Teil 2).
  • Das WeChat-Applet wird zum Laden nach oben und zum Aktualisieren nach unten gezogen (onscrollLower) und lädt Daten stapelweise (I).
  • Beispielcode für das dynamische Laden von Daten beim WeChat-Applet

<<:  So beheben Sie den 10060-Unknow-Fehler, wenn Navicat eine Remote-Verbindung zu MySQL herstellt

>>:  Detaillierte Erklärung zum Kopieren und Sichern von Docker-Containerdaten

Artikel empfehlen

So kopieren Sie schnell große Dateien unter Linux

Daten kopieren Beim Remote-Kopieren von Daten ver...

Implementierung eines Redis Master-Slave-Clusters basierend auf Docker

Inhaltsverzeichnis 1. Ziehen Sie das Redis-Image ...

So verwenden Sie das Vue-Router-Routing

Inhaltsverzeichnis 1. Beschreibung 2. Installatio...

Prometheus überwacht MySQL mithilfe der Grafana-Anzeige

Inhaltsverzeichnis Prometheus überwacht MySQL übe...

Beispielerklärung für Ausführungskontext und Ausführungsstapel in JavaScript

JavaScript - Prinzipienreihe Wenn wir in der tägl...

Detaillierte Erläuterung des Ausführungsplans, Beispiel für einen Befehl in MySQL

Vorwort Der Befehl „Explain“ ist die primäre Mögl...

JS implementiert einfachen Kalendereffekt

In diesem Artikel wird der spezifische JS-Code zu...

So führen Sie JavaScript in Jupyter Notebook aus

Später habe ich auch hinzugefügt, wie man Jupyter...

JavaScript implementiert einfaches Scrollfenster

In diesem Artikelbeispiel wird der spezifische Ja...

Detaillierte Erklärung der JS-Ereignisdelegation

1. Jede Funktion ist ein Objekt und belegt Speich...