2017-05-31 5 views
0

の反応の状態インターフェイスを変更することはできません、私はcloseLeftColの状態を変更することはできません: Cannot assign to leftWidth because it is a constant or read only propertyはイムはコンパイルエラーを取得し、怒鳴るのコードでは+ typescriptです

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() {...} 

} 

なぜ私はそれを変更することができていますcontructore?それは何を読み込み専用にしていますか? enter image description here

+0

@AndrewLiは暗黙的ではありませんか?なぜ私は型をデカル化する必要がありますか?継承しているときにすでにデシェルターになっています。 – Shazam

答えて

1

Never mutate this.state directly 、常にstate値を更新するsetStateを使用しています。

はこのようにそれを書く:

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

setStateで '='を使用できますか?それは有効なjsオブジェクトであってはなりませんか? – nrgwsth

+0

ああ、私の間違い(コピー貼り付けエラー)は、 '='を使用することができません。これは ':'を使用する必要があるオブジェクトだからです。更新された答えを確認してください:) –

+0

しかし、私は緩いtypescriptのタイプのヒント。 setstate内の "強い"ではない – Shazam

0

その他の観光スポット、その後constructor、あなたはstateを変更するsetStateメソッドを呼び出す必要があります。

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

しかし、私はタイプスクリプトのヒントを見逃しています。 – Shazam

+0

@Shazam状態を更新できるのは、 'setState'だけです。他の方法はありません。しかし、新しい状態オブジェクトを渡すか、新しい状態を返す関数を渡すなどの方法で、 'setState'を使うことができます。私は答えを更新しました。それがあなたのために働くかどうか確認してください。申し訳ありませんが、私はタイプスクリプトのヒントについてあまりよくありません。 – nrgwsth

関連する問題