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

Eingabetyp begrenzen (mehrere Methoden)

1. Es können nur chinesische Schriftzeichen eingeg...

Vue implementiert eine gleitende Navigation oben links und rechts

Navigation und andere Dinge werden bei der täglic...

Konkretes Beispiel einer MySQL-Mehrtabellenabfrage

1. Verwenden Sie die SELECT-Klausel, um mehrere T...

So verwenden Sie CURRENT_TIMESTAMP in MySQL

Inhaltsverzeichnis Verwendung von CURRENT_TIMESTA...

Beispielcode zur Implementierung eines 3D-Bucheffekts mit CSS

Schauen wir uns zunächst ohne Umschweife die Rend...

Detaillierte Erläuterung der JavaScript-Closure-Probleme

Closures sind eines der traditionellen Features r...

Ubuntu 16.04 mysql5.7.17 öffnet Remote-Port 3306

Aktivieren Sie den Remotezugriff auf MySQL MySQL-...

Tutorial zum Erstellen eines CA-Zertifikats unter Linux Centos8

Installieren der erforderlichen Dateien Yum insta...

So starten Sie Tomcat mit jsvc (als normaler Benutzer ausführen)

Einführung in jsvc In der Produktion sollte Tomca...

Zusammenfassung der HTML-Hack-Tags im IE-Browser

Code kopieren Der Code lautet wie folgt: <!--[...

Drei Möglichkeiten zum Weiterleiten des Linux-SSH-Ports

ssh ist eines der beiden Befehlszeilentools, die ...

MySQL etabliert eine effiziente Indexbeispielanalyse

Dieser Artikel beschreibt anhand von Beispielen, ...