2017-05-31 3 views
0

Im unten Code, im einen Kompilierungsfehler bekommen, kann ich nicht den Zustand, in closeLeftCol ändern: Cannot assign to leftWidth because it is a constant or read only property:Kann nicht Zustand Schnittstelle ändern in reagieren + Typoskript

interface ILayoutState{ 
     rightClassName: string, 
     leftClassName: string, 
     leftWidth: string, 
     rightWidth : string 
    } 

    export default class Layout extends React.Component<undefined, ILayoutState> { 

     constructor(props) { 
      super(props); 
      this.state = { 
       rightClassName: "right-col slide-in", leftClassName: "left-col slide-in", leftWidth: '' ,rightWidth : '' }; 

     } 

     closeLeftCol() { 
      this.state.leftWidth = "0"; 
      this.state.rightWidth = "100%"; 
      this.state.leftClassName += " hideme"; 
      this.state.rightClassName += " full"; 
      this.forceUpdate(); 
     } 

     render() {...} 

} 

Warum bin ich in der Lage, es zu ändern in der Bauherr? Was macht es nur lesen? enter image description here

+0

@AndrewLi ist das nicht implizit? Warum muss ich den Typ entkalken? es ist bereits entkräft, wenn er erbt. – Shazam

Antwort

1

Never mutate this.state directly, immer setState verwenden, um die state Werte zu aktualisieren.

schreiben es so:

closeLeftCol() { 
    this.setState(prevState => ({ 
      leftWidth : "0", 
      rightWidth : "100%", 
      leftClassName : prevState.leftClassName + " hideme", 
      rightClassName : prevState.rightClassName + " full" 
    }));    
} 
+0

Können wir '=' in setState verwenden? Sollte es kein gültiges js-Objekt sein? – nrgwsth

+0

oh sorry mein Fehler (Copy Paste Error), wir können nicht '=' verwenden, weil es ein Objekt ist, das wir verwenden müssen ':'. Überprüfen Sie die aktualisierte Antwort :) –

+0

Aber dann habe ich Typhinweis Typ Hinting. es ist nicht "stark" innerhalb setstate – Shazam

0

Andere Orte dann constructor, müssen Sie setState Methode aufrufen state ändern.

closeLeftCol() { 
      this.setState({ 
       //change state here 
       leftWidth: "0", 
       rightWidth: "100%", 
       leftClassName: this.state.leftClassName + " hideme", 
       rightClassName: this.state.rightClassName + " full" 
      }) 
      //or use this way 
      this.setState((prevState)=>{ 
       return { 
        //change state here 
        leftWidth: "0", 
        rightWidth: "100%", 
        leftClassName: prevState.leftClassName + " hideme", 
        rightClassName: prevState.rightClassName + " full" 
       } 
      }) 
     } 
+0

Aber dann verliere ich Typoskript Typ Hinting. es ist nicht "stark" innerhalb setstate – Shazam

+0

@Shazam Sie können den Status nur mit 'setState' aktualisieren. Es gibt keine andere Methode. Sie können 'setState' jedoch auf zwei Arten verwenden, indem Sie ein neues Statusobjekt übergeben oder eine Funktion übergeben, die einen neuen Status zurückgibt. Ich habe die Antwort aktualisiert. Überprüfen Sie, ob es für Sie funktioniert. Tut mir leid, ich habe nicht viel über Typhinweishinweis. – nrgwsth

Verwandte Themen