通过要求单独开发,您基本上要求在多个上下文中使用相同的组件。无论如何,构建它以使其能够在多个上下文中工作是一个好主意,这样您就可以在多个地方或多个应用程序中重用您的组件。
但要做到这一点,您必须将应用程序特定的所有内容作为道具传递。值得注意的是,这包括通常会调用应用程序的操作创建者的事件处理程序。
您可以通过在闭包中开发组件来伪造您的调度程序和操作创建者。您可能希望将用户数据作为道具以及您的事件处理程序传入。在真正的 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;