setState()でstateを書き換えた場合は、コンポーネントに対してアップデートが自動的に実行され、変更があれば再レンダリングが行われます。対して、this.state.プロパティ名 = でstateを書き換えても、手動または他の手段でアップデートが実行されない限り、再レンダリングはされず、表示が変わりません。
違いを見るためのちょっとしたサンプルを作りました。
JavaScript
1class Main extends React.Component {
2 constructor(props) {
3 super(props);
4 this.state = {
5 a: 0,
6 b: 0,
7 };
8 }
9 aUp() {
10 this.setState({
11 a: this.state.a + 1
12 });
13 }
14 bUp() {
15 this.state.b = this.state.b + 1;
16 }
17 render() {
18 return (
19 <div>
20 <div>
21 <input type="button" onClick={this.aUp.bind(this)} value="a up" />
22 <span> a = {this.state.a}</span>
23 </div>
24 <div>
25 <input type="button" onClick={this.bUp.bind(this)} value="b up" />
26 <span> b = {this.state.b}</span>
27 </div>
28 </div>
29 );
30 }
31}
32
33ReactDOM.render(
34 <Main />,
35 document.getElementById('main')
36);
37
CodePenでの動作の様子
a upとb upを押したときの動作の違いについて確認してみてください。
なお、constructor()に関しては、コンポーネント作成時の呼び出しでconstructor()実行後にレンダリング処理が行われるため、setState()は使わずにthis.stateを直接作成することになります。
退会済みユーザー
2017/06/18 03:59