2017-11-14 5 views
2

私は本当にリアクション機能の基本的なビットをまとめて誰かを見せてくれました。私のコンソールタブは私に状態を直接変えていると非難しています。 this.setState()を使っている限り、基本的にはうまくいくと思いました。これは実際に状態を突然変異させていますか?

この小さなコードは、状態に格納されたpersonオブジェクトの最初の人物を吐き出し、ボタンをクリックすると年齢を増やします(これは実際にはすべて機能します)。

これを行うことで実際に状態を直接変えていますか?そして私がいれば、これを行う正しい方法は何ですか? setStateとして

import React, { Component } from 'react'; 
import './App.css'; 
import Person from './Person/Person'; 

class App extends Component { 
    state = { 
    persons: [ 
     { name: 'Max', age: 28 }, 
     { name: 'Stephanie', age: 26 }, 
     { name: 'Manu', age: 29 }, 
    ], 
    } 

    increaseAgeHandler =() => { 
    this.setState({ 
     persons: [ 
     { name: 'Max', age: this.state.persons[0].age += 1 }, 
     { name: 'Stephanie', age: 26 }, 
     { name: 'Manu', age: 29 }, 
     ], 
    }); 
    } 

    render() { 
    return (
     <div className="App"> 
     <h1>This is an app</h1> 
     <button onClick={this.increaseAgeHandler}>Add to age</button> 
     <Person name={this.state.persons[0].name} age={this.state.persons[0].age} /> 
     </div> 
    ); 
    } 
} 

export default App; 
+0

あなたの州がコンストラクタの外にある理由はありますか? –

+1

@LucasOliveira多分bcosにコンストラクタはありませんか? – Dane

答えて

4

以下のようにsetStateコールバック関数の引数としてprevStateを渡すことをお勧めし1で年齢を増加させる非同期です。

increaseAgeHandler =() => { 

    this.setState(prevState => { 
     persons: [ 
     { name: 'Max', age: prevState.persons[0].age + 1 }, 
     { name: 'Stephanie', age: 26 }, 
     { name: 'Manu', age: 29 }, 
     ], 
    }); 

    } 
+0

AH。ありがとうございました!それは完全に理にかなっています。私は 'prevState'について聞いたことがありますが、なぜそれを使用するのか本当に理解できませんでした。乾杯。 –

+0

'prevState'はReactの特定のキーワードではありません。これは 'setState'だけでなく、' componentDidUpdate'、 'shouldComponentUpdate'などにも渡された引数です。あなたは 'prevState'の代わりに任意の識別子を使用することができます – Dane

2

そう:

this.state.persons[0].age += 1 

あなたは年齢の変数のための新たな指針を作成したいacutally変異であるあなたは、以下のように以前の状態に1を追加する場合も、状態のない突然変異はありませんそう、あなたが実際にやろうとしている:あなたはこのことについて質問があれば

this.state.persons[0].age + 1 

この前の値を変異し、あなたの状態に新しいポインタを追加していない、ただ撃ちます!それが理解できることを願っています。

+0

これは優れています - これで、あなたは '+ = 1'ではなく' + 1'を行うことができることが分かりました。その小さな変更は問題を解決します、ありがとう! –

1
this.state.persons[0].age += 1 

+=代入演算子であるので、これは直接ageを変化させます。代わりに、単に割り当てず、年齢に1を追加します。あなたがSETSTATE()を呼び出すと

this.state.persons[0].age + 1 
0

は、リアクトは、現在の状態、それはコンストラクタでのみassinableだ

constructor(props) { 
    super(props); 
    this.state = { 
     persons: [ 
     { name: 'Max', age: 28 }, 
     { name: 'Stephanie', age: 26 }, 
     { name: 'Manu', age: 29 }, 
     ] 
    }; 
    } 

this.stateにあなたが提供するオブジェクトをマージし、別々のsetState()呼び出しでそれらを個別に更新することができます。 lifecycleに反応について

increaseAgeHandler =() => { 
    this.setState({ 
     persons: [ 
     { name: 'Max', age: this.state.persons[0].age += 1 }, 
     { name: 'Stephanie', age: 26 }, 
     { name: 'Manu', age: 29 }, 
     ], 
    }); 
    } 

さらに詳しい情報:

代わり
this.state.persons[0].age += 1 

、使用SETSTATE(): は直接

は、例えば、これは、コンポーネントを再レンダリングしません状態に変更しないでください

+0

代入演算子 '+ ='のために、ここでも直接状態を変更していることに注意してください。 –

関連する問題