React.Componentのメンバ変数は、再レンダー時に更新されるとは限らない!
ReactでsetState()
しても値が更新されなくてハマったので、記事化します。
更新すべき値をメンバ変数に格納した場合
ボタンを押すと値が+1されるアプリケーションを作ります。
以下は間違ったコードです。
Appでカウンターの値を管理し、Counterはその値とカウントボタンを表示します。
import React from 'react'
import ReactDOM from 'react-dom'
import Counter from './counter'
class App extends React.Component {
constructor(props) {
super(props)
this.state = {count: 0}
this.increment = this.increment.bind(this)
}
increment() {
this.setState(
(state) => {return {count: state.count + 1}}
)
}
render() {
return (
<Counter count={this.state.count} onClick={this.increment} />
)
}
}
let app = document.getElementById('app')
ReactDOM.render(<App />, app)
import React from 'react'
class Counter extends React.Component {
constructor(props) {
super(props)
this.count = this.props.count
}
render() {
// 以下の`this.count`は、新しいpropsを反映しない!
return (
<div>
<p>{this.count}</p>
<button onClick={this.props.onClick}>カウント</button>
</div>
)
}
}
export default Counter
このコードを実行し、ボタンをクリックしても、カウンターの値は増加しないと思います。
レンダーごとに更新する値は、メンバ変数に保存しない
値が更新されない原因は、表示する値がthis.count
になっていることです。
counter.jsを以下のように修正すれば、ちゃんとカウント値が増加します。
import React from 'react'
class Counter extends React.Component {
constructor(props) {
super(props)
}
render() {
return (
<div>
<p>{this.props.count}</p>
<button onClick={this.props.onClick}>カウント</button>
</div>
)
}
}
export default Counter
今回は、this.props.count
を表示するだけなので、わざわざメンバ変数に格納することはありませんが、表示させるべき値が複雑になる場合、render
メソッドの戻り値に直接式を書かずに、結果を変数に格納したい場合があります。そういう場合は、たとえば関数にすると良いと思います。
class Counter extends React.Component {
constructor(props) {
super(props)
}
render() {
let count = this._getCount()
return (
<div>
<p>{count}</p>
<button onClick={this.props.onClick}>カウント</button>
</div>
)
}
_getCount() {
let count;
// すごく複雑な処理
return count
}
}
以上です。
Author And Source
この問題について(React.Componentのメンバ変数は、再レンダー時に更新されるとは限らない!), 我々は、より多くの情報をここで見つけました https://qiita.com/ssint1120/items/8dbd5aeed3e748fd1ddd著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .