単独での開発を依頼することで、基本的には複数のコンテキストで同じコンポーネントを使用するよう依頼することになります。コンポーネントを複数の場所または複数のアプリケーションで再利用できるように、複数のコンテキストで動作できるように構築することは良い考えです。
しかし、それを行うには、アプリケーション固有のすべてを props として渡す必要があります。特に、これには通常アプリケーションのアクション クリエーターを呼び出すイベント ハンドラーが含まれます。
クロージャでコンポーネントを開発することにより、ディスパッチャとアクション クリエータを偽造できます。ユーザーデータを小道具として、またイベントハンドラーとして渡したいと思うでしょう。実際の Flux アプリでは、UserStore からデータを取得し、そのデータをコンポーネントに渡すコントローラー ビュー コンポーネントがあります。したがって、ディスパッチャ、アクション、およびコントローラ ビューはすべて、クロージャによって偽造されます。
実際のディスパッチャーとアクションを使用する代わりに、単純なことを実行してクロージャー内の状態を更新します。したがって、開発ベンチは次のようになります。
var React = require('react');
var AutoSuggest = require('AutoSuggest');
var container = document.getElementById('development-container');
var users = [
{ id: '1', name: 'Joey' },
{ id: '2', name: 'Johnny' },
{ id: '3', name: 'Dee Dee' },
{ id: '4', name: 'Tommy' }
];
var onKeyDown = function() {
// do stuff with users
render(container);
}
var render = function(container) {
React.renderComponent(
<AutoSuggest
users={users}
onKeyDown={onKeyDown}
/>,
container
);
};
render(container);
そして、実際の本番コードは次のようになります。
var React = require('react');
var AutoSuggest = require('AutoSuggest');
var UserStore = require('UserStore');
var UserActions = require('UserActions');
function onKeyDown(e) {
UserActions.doSomething(e.value);
}
var SomeControllerView = React.createClass({
getInitialState: function() {
return {
users: UserStore.getAll();
};
},
componentWillMount: function() {
UserStore.addListener('change', this.onChange.bind(this));
},
render: function() {
return (
<AutoSuggest
users={this.state.users}
onKeyDown={onKeyDown}
/>
);
},
componentWillUnmount: function() {
UserStore.removeListener('change', this.onChange);
},
onChange: function() {
this.setState({
users: UserStore.getAll()
});
}
});
module.exports = SomeControllerView;