2017-07-17 3 views
0

ich eine Liste habe ich nach unten scrollen will, muss ich meine Komponente wie diese componentDidUpdate scroll nach unten, wenn Element geladen wird

class Msg extends Component { 

    componentDidUpdate() { 

     if(this.container){ 
      this.container.scrollTop = this.container.scrollHeight 
     } 
    } 

    render() { 
     return(
      <div ref={elem = this.container = elem}> 
       <Item /> 
       <Item /> 
       <Item /> 
      </div> 
     ) 
    } 
} 

codiert Es funktionierte. Aber das Problem ist, dass es jedes Mal scrollt, wenn die Komponente neu rendert. Msg hat viele untergeordnete Komponenten, löst den Status der untergeordneten Komponente aus, damit die Msg-Komponente erneut gerendert wird. Wie löst man dieses Problem?

Um es wie ein normaler Benutzer zu erklären:

Benutzerrollen auf der Liste, klicken Sie dann auf Dropdown irgendwo löste die componentDidUpdate, nach unten gescrollt verursacht.

+0

Also, wenn Sie es wollen ... nach unten scrollen, wenn ein neues Element hinzugefügt wird? Ich würde vorschlagen, dem UX eine neue Schaltfläche hinzuzufügen, die es dem Benutzer ermöglicht, bei Bedarf nach unten zu scrollen. – camou

+0

@camou in der msg von whatssap, hast du einen Knopf dafür gesehen? –

+0

Nein, aber WhatsApp zwingt mich nicht zu gehen, wenn ich auf iOS9.2 scrolle. Wann möchten Sie also nach unten scrollen, wenn eine neue Nachricht angezeigt wird oder wenn der Benutzer innerhalb der letzten Sekunden aufhört zu scrollen? – camou

Antwort

0

Um zum ersten Mal nach unten zu scrollen, wenn die Komponente gerendert wird, sollten Sie componentDidMount lifecycle hook verwenden.

Wenn Sie möchten, dass die Liste bei jedem Hinzufügen eines Elements einen Bildlauf durchführt, können Sie componentDidUpdate Hook verwenden, wie Sie jetzt verwenden, aber anstatt scrolltop jedes Mal zu bearbeiten, überprüfen Sie, ob sich die Anzahl der Elemente geändert hat. Jetzt legen Sie den Bildlauf bei jeder Aktualisierung der Komponente fest.

componentDidUpdate bekommt beide vorherigen Requisiten und früheren Zustand als Parameter, so können Sie so etwas schreiben:

componentDidUpdate(prevProps, prevState) { 
    if (this.props.items.length > prevProps.items.length) { 
     this.refs.container.scrollTop = this.refs.container.scrollHeight; 
    } 
} 

Hier ist eine gute Referenz für reagiert Lifecycle Haken: http://busypeoples.github.io/post/react-component-lifecycle/

+0

setzen Sie dies 'this.refs.container.scrollTop = this.refs.container.scrollHeight;' in componentDidMount wird es nicht funktionieren –

+0

Was rendern Sie in Ihrer Liste? Z.B. Bei Bildern kann scrollHeight während componentDidMount immer noch Null sein, da die Bilder noch nicht geladen wurden und keinen Platz im Container einnehmen. – Matti

+0

Bilder und Text. –

0

Verwendung so etwas wie dieses add ein leeres div am Ende der Liste

<div ref="blankdiv"></div>

dann in jedem componentDidMount Scroll div dies in Bildschirm

this.refs.blankdiv.scrollIntoView()

Verwandte Themen