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

17 404-Seiten, die Sie erleben möchten

Wie können wir sagen, dass wir 404 vermeiden soll...

So fügen Sie Batchdaten unter Node.js in eine MySQL-Datenbank ein

Im Projekt (nodejs) müssen mehrere Daten gleichze...

js implementiert das Popup-Anmeldefeld durch Klicken auf das Popup-Fenster

In diesem Artikel wird der spezifische Code von j...

Beispielanalyse der Verwendung von GROUP_CONCAT in MySQL

Dieser Artikel beschreibt anhand eines Beispiels ...

Eine kurze Diskussion über die MySQL-Optimierungslösung für große Tabellen

Hintergrund Die Menge neuer Daten in der Geschäft...

Zusammenfassung der Vorteile der Bereitstellung von MySQL Delayed Slaves

Vorwort Die Master-Slave-Replikationsbeziehung vo...

Lösung für FEHLER 1366 bei der Eingabe von Chinesisch in MySQL

Beim Eingeben von Chinesisch in MySQL tritt der f...

Anweisungen zum Erlernen von Vue

Inhaltsverzeichnis 1. v-Text (v-Befehlsname = „Va...

Vue implementiert eine Komponente zur dynamischen Abfrageregelgenerierung

1. Dynamische Abfrageregeln Die dynamischen Abfra...