私は実際にreactjsを学んでおり、TODOと呼ばれる「親コンポーネント」の中にラップされた小さなTODOリストを実際に開発しています。
この親の内部で、関係するストアから TODO の現在の状態を取得し、この状態をプロパティとして子コンポーネントに渡します。
問題は、親状態の値をどこで初期化するかわからないことです。
実際、私は ES6 構文を使用しているため、getInitialState() 関数はありません。コンポーネントコンストラクターを使用してこれらの状態値を初期化する必要があるとドキュメントに書かれています。
実際には、コンストラクター内で状態を初期化したい場合、 this.context (Fluxible Context) は実際には未定義です。
初期化を componentDidMount 内に移動することにしましたが、アンチ パターンのようで、別の解決策が必要です。手伝って頂けますか ?
これが私の実際のコードです:
import React from 'react';
import TodoTable from './TodoTable';
import ListStore from '../stores/ListStore';
class Todo extends React.Component {
constructor(props){
super(props);
this.state = {listItem:[]};
this._onStoreChange = this._onStoreChange.bind(this);
}
static contextTypes = {
executeAction: React.PropTypes.func.isRequired,
getStore: React.PropTypes.func.isRequired
};
componentDidMount() {
this.setState(this.getStoreState()); // this is what I need to move inside of the constructor
this.context.getStore(ListStore).addChangeListener(this._onStoreChange);
}
componentWillUnmount() {
this.context.getStore(ListStore).removeChangeListener(this._onStoreChange);
}
_onStoreChange () {
this.setState(this.getStoreState());
}
getStoreState() {
return {
listItem: this.context.getStore(ListStore).getItems() // gives undefined
}
}
add(e){
this.context.executeAction(function (actionContext, payload, done) {
actionContext.dispatch('ADD_ITEM', {name:'toto', key:new Date().getTime()});
});
}
render() {
return (
<div>
<button className='waves-effect waves-light btn' onClick={this.add.bind(this)}>Add</button>
<TodoTable listItems={this.state.listItem}></TodoTable>
</div>
);
}
}
export default Todo;