はじめに
私はしばらく前からReactが気になっていて、この間ついに手を出しました。
まずは簡単なWebアプリを作ってみようと思い、コードを書いて動作確認していたのですが、嵌った点があるので書いていきます。
やっていたこと
まず、アプリ全体のコンポーネントを作成しました。
import {React} from 'react';
import ComponentA from './componentA.tsx';
class App extends React.Component {
constructor(props) {
super(props);
this.state = {
fuga: /* Object */
};
}
onEvent(e) {
this.setState(
() => {
{fuga: /* new Object */}
}
);
}
render() {
return (
<div
onClick={this.onEvent.bind(this)}
>
<ComponentA
fuga={this.state.fuga}
/>
</div>
);
}
}
export default App;
後で書くコンポーネントに、prop
としてfuga
というオブジェクトを渡すというものになっています。
ダメだった例
内部のコンポーネントのコードを、まず下記のようにしました。
import {React} from 'react';
class ComponentA extends React.Component {
constructor(props) {
super(props);
this.state = {hoge: this.fuga(this.props.piyo)}
}
fuga(piyo) {
// 値の加工処理
}
render() {
return (<div>{this.state.hoge}</div>);
}
}
export default ComponentA;
そして実際にアプリを起動して動作確認をしたのですが、画面をクリックしても何も反応がありませんでした。
どこで問題が起こっているかを探ってみたところ、どうもApp
内のthis.state.fuga
の更新はされているものの、ComponentA
のthis.state.hoge
が更新されず、従ってComponentA
の更新もされていないようでした。
成功した例
色々方法を考え試した結果、以下のコードになりました。
import {React} from 'react';
class ComponentA extends React.Component {
constructor(props) {
super(props);
}
fuga(piyo) {
// 値の加工処理
}
render() {
return(<div>{this.fuga(this.props.piyo)}</div>)
}
}
export default ComponentA;
constructor
内でthis.state
をthis.props
を用いて定義せず、render
関数内にthis.props
を用いた処理を書くということで解決できるようでした。
おわりに
Reactは奥が深いですね…。
この問題について上手く説明できる方がいらっしゃいましたら、コメント等頂けると有り難いです。