2016-06-28 13 views
0

Mein Plan ist, Daten zu laden, wenn Sie die unten auf der Seite bewegen und erreichen. Ich benutze JQuery Scroll, um es möglich zu machen, und es funktioniert gut, wenn keine Daten angezeigt werden (nur die Daten der Konsole protokollieren). Aber wenn ich anfange, Daten anzuzeigen, blitzt der Scroll zweimal oder etwas anderes zweimal, was ich nicht weiß, was. Hier ist mein Code:JQuery scroll Feuer zweimal beim Laden reagiert js Komponentendaten

import React from 'react'; 

class UsersBrowse extends React.Component { 
    render() { 
    let x = this.props; 
    $(window).unbind('scroll').scroll(function() { 
     if($(window).scrollTop() + $(window).height() == $(document).height()) { 
     const {loadMore, currentPage} = x; 
     loadMore(currentPage); 
     } 
    }); 
    const {scanUserResult, loading} = this.props; 
    console.log(this.props); 
    return (
     <div> 
     {scanUserResult ? scanUserResult.map(users => (
      <div key={users._id}> 
      <div>{users._id}</div> 
      </div> 
     )):<img src={loading} height="100" width="100" />} 
     </div> 
    ); 
    } 
} 

export default UsersBrowse; 

Der Code funktioniert gut, wenn ich nur die Daten-Konsole anmelden, aber wenn ich es auf der Seite angezeigt werden überspringt es wie:

Lasten Seite 1 Seite 2 Lasten überspringen Seite 3 Seite 4 lädt Seite 5 überspringen

Meine Erwartung ist, sollte es laden:

page1 page2 pa ge3 page4

Es funktioniert, wenn ich es wie folgt tun:

import React from 'react'; 

class UsersBrowse extends React.Component { 
    render() { 
    const {scanUserResult, loading} = this.props; 
    let x = this.props; 
    $(window).unbind('scroll').scroll(function() { 
     if($(window).scrollTop() + $(window).height() == $(document).height()) { 
     const {loadMore} = x; 
     loadMore(); 
     } 
    }); 
    console.log(this.props); 
    return (
     <div> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     test<br/> 
     </div> 
     // <div> 
     // {scanUserResult ? scanUserResult.map(users => (
     //  <div key={users._id}> 
     //  <div>{users._id}</div> 
     //  </div> 
     // )):<img src={loading} height="100" width="100" />} 
     // </div> 
    ); 
    } 
} 

export default UsersBrowse; 

Jede Idee? Danke

+0

es das Problem scheint in der Rückkehr ist(); hhhmmmm ...... –

Antwort

0

Ich denke, es ist, weil es zwei mal $(window).scrollTop() + $(window).height() == $(document).height(), so dass es zweimal auslösen. vielleicht kannst du eine Fahne dafür setzen.

static loading = true; 
render() { 
    let x = this.props; 
    $(window).unbind('scroll').scroll(function() { 
     if($(window).scrollTop() + $(window).height() == $(document).height() && loading == true) { 
     loading = false; 
     const {loadMore, currentPage} = x; 
     loadMore(currentPage); 
     } 
    }); 
    const {scanUserResult, loading} = this.props; 
    console.log(this.props); 
    return (
     <div> 
     {scanUserResult ? scanUserResult.map(users => (
      <div key={users._id}> 
      <div>{users._id}</div> 
      </div> 
     )):<img src={loading} height="100" width="100" />} 
     </div> 
    ); 
    } 
+0

vielen Dank für die Antwort lassen Sie mich versuchen, es ein min –

+0

ich die Fahne tat kombiniert mit ** componentDidMount **. . es funktioniert beim ersten Scrollen, die Datenanzahl ist wie erwartet ausgefallen; Die Daten werden jedoch nicht auf den zweiten Bildlauf geladen. Meine Vermutung ist, weil die Variable ** loading ** jetzt ** falsch ** ist. Ich dachte, dass das Laden wieder ** wahr ** wird, wenn ich zurück blättern kann. Gibt es eine Möglichkeit, das ** componentDidMount ** auszulösen? –

+0

sollten Sie das Flag in Ihrer loadMor-Funktion auf true setzen. Nachdem Sie die Daten der nächsten Seite abgerufen haben, legen Sie sie einfach auf "wahr" fest. – chenkehxx

0

Meine Vermutung (ich muß den gesamten Code sehen, um zu bestätigen), dass, wenn Ihr Inhalt gerendert wird, ist es Ihre Seite größer macht (die Höhe zu erhöhen), wenn Ihre Seite wächst, die scroll Veranstaltung wird gefeuert, wodurch deine Komponente neu gerendert wird (ich müsste deinen Code überprüfen, um die Beziehung zwischen deinen Requisiten usw. zu sehen) und Dinge in deiner Konsole protokollieren.

Sie müssen es nur besser orchestrieren, manchmal hilft ein Zeitlimit oder eine Art "Ladezustand", oder Sie können das Bildlaufereignis "sperren", bis die Komponente neu gerendert wird.

Nur ein Tipp, es ist kein gutes Muster Ereignisse zu binden, auf machen. Sie können componentDidMount und componentWillUnmount in diesem Fall verwendet werden.

+0

vielen Dank für den Tipp, ich werde es anwenden :) –

+0

Die ** componentDidMount ** funktioniert kombiniert mit dem ** chenkehex ** Vorschlag über die Kennzeichnung zu verhindern, dass die Schriftrolle zweimal feuern. Jetzt funktioniert es nur beim ersten Scrollen. Gibt es eine Möglichkeit, den ** componentDidMount ** zurück zu triggern? –

+0

Nun, Sie sollten zuerst die "unbind" -Scroll aus Rendern entfernen, und verschieben Sie es auf "ComponentWillUnmount". Auf diese Weise wird Ihr Bildlaufereignis korrekt behandelt. Das einzige, was Sie tun müssen, ist die nächste Seite mit einem Zustand oder einer Stütze zu behandeln. Aber ich denke, das "Unbind" an die richtige Stelle zu setzen, wird es funktionieren lassen. –

0

sortiert schließlich durch Zugabe es in componentWillMount aus und setzen dann ein Timeout von 200 ms.

Infinite scroll fired twice on refresh from the bottom of page

-Code lautet wie folgt:

import React from 'react'; 

class UsersBrowse extends React.Component { 
    componentWillMount() { 
    let x = this.props; 
    let timeout; 
    $(window).scroll(function(){ 
     clearTimeout(timeout); 
     timeout = setTimeout(function(){ 
     if($(window).scrollTop() + $(window).height() == $(document).height()) { 
      const {loadMore} = x; 
      loadMore(); 
     } 
     }, 200); 
    }); 
    } 

    render() { 
    const {scanUserResult, loading} = this.props; 
    console.log(this.props); 

    return (
     <div> 
     {scanUserResult ? scanUserResult.map(users => (
      <div key={users._id}> 
      <div>{users._id}</div> 
      </div> 
     )):<img src={loading} height="100" width="100" />} 
     </div> 
    ); 
    } 

} 

export default UsersBrowse; 

Entschlossen: D

Verwandte Themen