2017-08-10 5 views
0

Bitte lesen Sie die vollständige Frage, wie es hilfreich sein kann, dieses Verhalten zu kennen.Weird Fehler in reaktiven nativen ListView

Ich habe eine unterteilte ListView, die eine Liste von Aufgaben enthält. Die Listenansicht besteht aus drei Abschnitten (Zuletzt, Später und Zurück). Jede Aufgabe kann eine Liste von Benutzern enthalten, die informiert werden sollen, wenn eine Aufgabe erledigt ist. Eine Aufgabe wird in den Bereich Past verschoben, wenn sie als erledigt markiert ist. Wenn eine Aufgabe markiert ist als getan, unten Dinge stattfinden

  1. Mark die Aufgabe, wie sie in der Redux Speicher getan
  2. Wenn die Aufgabe Teilnehmer hat,
  3. eine Remote-Benachrichtigung an die Teilnehmer senden

Wenn die Aufgabe wird als erledigt markiert, der Redux-Speicher wird aktualisiert, was ein erneutes Rendern des ListView auslöst. Der zweite Schritt geschieht, nachdem die ListView entsprechend den Protokollen neu gerendert wurde.

Was passiert ist, dass der zweite Schritt mit den Requisiten einer anderen Aufgabe ausgelöst wird und nicht die Aufgabe, die als erledigt markiert wurde. Es ist, als ob die ListView Elemente wiederverwendet wurden und das ListView Element, das zuvor für die Aufgabe verwendet wurde, die als erledigt markiert ist, wird nun für ein anderes Element wiederverwendet und der Rest des Codes wird unter Verwendung der Requisiten für diese andere Aufgabe ausgeführt, die sehr seltsam ist. Unten ist, wie es in dem Code

changeTaskStatus =() => { 
    this.props.dispatch(ActionCreators.markTaskDone(this.props.id)) 

    // A re-render is triggered once the above action is dispatched and the 
    // this.props.id in the next step is not the one that the user marked as done 
    this.props.dispatch(ActionCreators.notifyParticipants(this.props.id)) 
    } 

aussieht Ich werde versuchen, ein Beispielprojekt erstellen, das dieses Problem aufweist. Wenn Sie Informationen zu diesem Verhalten haben, senden Sie eine Antwort oder einen Kommentar.

+0

Ja ich wenig machen darüber wissen bitte bestätigen Sie es immer mit den Requisiten der letzten Aufgabe ausgelöst (im Sinne der zuletzt in Listenansicht) –

+0

Ich denke, das würde bedeuten, dass ich alle "Requisiten" in einem Objekt speichern und dieses Objekt für den Zugriff auf die Daten verwenden müsste. Es ist nicht sehr intuitiv und bricht das Schließverhalten für Javascript. –

Antwort

0

Sie sollten Daten mit ListView binden wie

<ListView ... renderRow={this.renderList.bind(this)} />

So folgen, wenn nach dem Update-Liste Sie ID in Funktion changeTaskStatus und Update Listview übergeben müssen.

Und Sie können auch separate Aufgabe ID und verwalten sie durch Ihre eigene Logik

+0

Ich glaube nicht, dass ich verstehe, was Sie vorschlagen möchten. Die Methode 'renderRow' ist bereits an 'this' gebunden. Die Methode 'changeTaskStatus' wird aufgerufen, wenn ein Benutzer auf eine Aufgabe klickt und die Aufgabenliste erneut gerendert wird, weil die Aufgabe als erledigt markiert wurde und das 'this' während des Aufrufs auf ein anderes Objekt zeigt, um Teilnehmer zu benachrichtigen. –

+0

Was ich denke ist, wenn Sie this.props.dispatch aufrufen (ActionCreators.notifyParticipants (this.props.id)) und Sie übergeben this.props.id möglicherweise erhalten Sie ID hier falsch, so müssen Sie hier überprüfen, wenn Sie nicht bekommen perfekte id hier dann geh mit meiner lösung –

+0

hi @Nisarg, du antwortest war nicht hilfreich für mich, weil es nichts mit der frage zu tun hat, die ich gefragt habe. –

Verwandte Themen