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

CSS Sticky Footer-Implementierungscode

Dieser Artikel stellt den Implementierungscode fü...

Detaillierte Erklärung zum Abrufen der IP-Adresse eines Docker-Containers

1. Nach dem Betreten des Containers Katze /etc/ho...

Implementierung der virtuellen React-Liste

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

Vue muss Wissenspunkte lernen: die Verwendung von forEach()

Vorwort Bei der Frontend-Entwicklung stoßen wir h...

So lösen Sie das Problem, das Root-Passwort von Mysql auf dem Mac zu vergessen

Ich habe MySQL auf meinem Computer längere Zeit n...

Konfigurieren Sie nginx so, dass es zur Systemwartungsseite umleitet

Letztes Wochenende bereitete sich ein Bruderproje...

Eine kurze Diskussion über Tags in HTML

0. Was ist ein Tag? XML/HTML-CodeInhalt in die Zw...

VMware12 installiert die Desktopversion von Ubuntu19.04 (Installations-Tutorial)

1. Versuchsbeschreibung Installieren Sie in der v...

Implementierungsmethode für die bidirektionale Bindung von Vue-Daten

Inhaltsverzeichnis 1. Einleitung 2. Code-Implemen...

Einführung in die Verwendung von CSS3-Filterattributen

1. Einleitung Beim Schreiben von Animationseffekt...