2017-06-15 14 views
0

Ich versuche, einen Wert aus meinem Status zu entfernen.Wert aus Status entfernen (neuen Status festlegen)

Ich benutze .filter, wie ich glaube, dies ist der einfachste Weg, es zu tun. Ich möchte auch eine undo Funktion implementieren (aber das ist außerhalb des Umfangs dieser Frage).

Ich habe diesen Code in einer Sandbox setzen https://codesandbox.io/s/yrwo2PZ2R

class App extends React.Component { 
    constructor(props) { 
    super(props); 
    this.state = { 
     movies: x.movies, 
    }; 
    } 
remove = (e) => { 
    e.preventDefault(); 
    console.log('remove movie.id:', e.target.value) 
    const index = e.target.value 
    this.setState({ 
    movies: this.state.movies.filter((_, e) => e.id !== index) 
    }); 
} 
    render() { 
    return (
     <div> 
     {this.state.movies.map(e => 
      <div key={e.id}> 
      <li>{e.name} {e.id}</li> 
      <button value={e.id} onClick={this.remove}>remove</button> 
      </div>, 
     )} 
     </div> 
    ); 
    } 
} 

Antwort

2

Zwei Probleme löschen.

Zunächst ist der Index, den Sie vom Ereigniszielwert erhalten, eine Zeichenfolge, aber Sie vergleichen mit einer Zahl. Ändern Sie den Index Erklärung wie folgt:

const index = Number(e.target.value); 

Zweitens Ihre Filter ein wenig ausgeschaltet ist. Dies funktioniert:

this.state.movies.filter(movie => movie.id !== index) 
0

Sie das gleiche auf die folgende Weise erreichen können

remove = (e) => { 
    e.preventDefault(); 
    console.log('remove movie.id:', e.target.value) 
    const index = e.target.value 
    var movies = [...this.state.movies] 
    var idx = movies.findIndex((obj) => obj.id === parseInt(index)) 
    movies.splice(idx, 1); 

    this.setState({ 
    movies 
    }); 
} 

Auch ParseInt verwenden Index in eine Zeichenfolge zu konvertieren, bevor verglichen wird. Das direkte Festlegen des aktuellen Status aus den vorherigen Statuswerten kann zu Problemen führen, da setState asynchron ist. Sie sollten idealerweise eine Kopie des Objekts erstellen und das Objekt mit Splice-Methode

CODESANDBOX

+0

das mir sagt, 'findIndex' keine Funktion ist. Könnten Sie es im Beispiel versuchen? https://codesandbox.io/s/yrwo2PZ2R – Ycon

+0

Nein. Das löscht das untere Element (nicht das spezifische Element, auf das ich klicke) – Ycon

+0

Nicht sicher, dass es ein guter Weg ist, das Problem zu lösen. Ich meine, benutze '==' anstelle von '==='. Type Cast ist eine viel offenere Lösung.Und es gibt eine geringere Wahrscheinlichkeit, beim Refactoring einen Fehler zu machen, wenn Sie eine explizite Typumwandlung haben. –

1

Das Problem ist index String-Typ, aber id in Objekte hat number Typ. Sie benötigen Typumwandlung, zum Beispiel:

const index = Number(e.target.value); 

Other than that, Sie haben etwas falsch _ in Rückruf von filter Funktionsaufruf. Du brauchst es nicht. Sie benötigen:

this.state.movies.filter(e => e.id !== index) 

Übrigens empfehle ich nicht, Werte auf diese Weise zu benennen. Warum e? Sie haben eine Reihe von Filmen. Verwenden Sie movie. Warum index? Sie müssen ID entfernen. Dann verwenden Sie idToRemove Name.

Sie haben auch Probleme beim Hinzufügen von Elementen.

Zum einen können Sie Elemente wie folgt hinzu:

this.setState({ 
    movies: [...this.state.movies, { name: item.value.name, id: item.value.id }], 
}) 

Ein weiterer Punkt: Sie id AUTOINCREMENT haben. Sie können den letzten Wert in einer Variablen speichern. this.idCounter zum Beispiel. Und fügen Sie wird wie folgt aussehen:

this.setState({ 
    movies: [...this.state.movies, { name: item.value.name, id: this.idCounter++ }], 
}) 

Beispiel: https://codesandbox.io/s/2vMJQ3p5M

+0

Können Sie mir in der Code-Sandbox zeigen? Ich war . nicht in der Lage, dein Beispiel anzuwenden. https://codesandbox.io/s/yrwo2PZ2R. Ich dachte, es wäre Zeile 52, die es hinzugefügt, das ist this.props.addItem (this.state); – Ycon

+0

Ich aktualisierte die Antwort erneut, so jetzt ist es voll (Sie müssen nicht akzeptieren, denn @SamHH Antwort war zuerst). Ich habe einige Vorschläge zu Variablennamen hinzugefügt, und es hat einen Teil über das Hinzufügen von Elementen. –

+0

Ein anderer Weg, um zu erreichen, was Sie wollen, ist "nicht streng Gleichheit". Aber ich bin mir nicht sicher, ob es eine gute Idee ist, es zu benutzen. Es ist viel mehr implizit. Das ist nicht gut. –

Verwandte Themen