Javascript 反应多个组件添加项
我正在用react编写一个web应用程序,并遵循flux架构。遗憾的是,到目前为止,我看到的所有教程要么只使用一个组件,要么有多个嵌套的组件 我的问题是如何将多个没有嵌套的组件一起使用。例如-项目列表组件使用某种表单组件添加新项目。每个示例通常将表单和列表放在同一父容器中 在下面的示例中,假设表单和列表组件都有自己的操作/存储,我如何说当表单的提交事件触发完毕时,更新列表组件 我是否在列表组件中添加对表单组件的引用(如Javascript 反应多个组件添加项,javascript,reactjs,flux,Javascript,Reactjs,Flux,我正在用react编写一个web应用程序,并遵循flux架构。遗憾的是,到目前为止,我看到的所有教程要么只使用一个组件,要么有多个嵌套的组件 我的问题是如何将多个没有嵌套的组件一起使用。例如-项目列表组件使用某种表单组件添加新项目。每个示例通常将表单和列表放在同一父容器中 在下面的示例中,假设表单和列表组件都有自己的操作/存储,我如何说当表单的提交事件触发完毕时,更新列表组件 我是否在列表组件中添加对表单组件的引用(如require('component') 这种做法不好吗?我应该制作一个超级组
require('component')
这种做法不好吗?我应该制作一个超级组件,其中包含这两个组件吗
var List = React.createClass({
render: function() {
return(
//list of items of some sort
);
}
});
var Form = React.createClass({
handleSubmit: function() {
//handle submit by firing an action for the dispatcher
},
render: function() {
return(
//form
);
}
});
在大多数应用程序中,您需要您的存储来允许组件订阅更改,以便在状态更新时通知组件 您可以为存储创建一个事件处理程序,然后在列表组件中附加一个侦听器
var List = React.createClass({
getInitialState: function() {
items: []
},
componentWillMount: function() {
store.addChangeListener(this.updateItems);
},
updateItems: function() {
this.setState({ items: store.getItems() });
},
render: function() {
return (
// ... render this.state.items
);
}
});
本例使用setState
,这会导致组件重新渲染,但您不必使组件处于有状态。您还可以将存储中的数据作为道具向下传递
您仍然可以从表单组件中分派操作,而无需对该代码进行任何更改,但是每当数据发生更改时,存储必须调用侦听器
不同的Flux实现以不同的方式处理通知商店消费者的想法
常规的vanilla Flux是如此的不受关注,以至于它实际上没有一个监听商店的系统。在一个例子中,他们在商店上创建了两个新方法,围绕着这个功能
emitChange: function() {
this.emit(CHANGE_EVENT);
},
/**
* @param {function} callback
*/
addChangeListener: function(callback) {
this.on(CHANGE_EVENT, callback);
}
然后,当一个操作修改存储时,该操作的处理程序负责调用emitChange
函数
case TodoConstants.TODO_CREATE:
text = action.text.trim();
if (text !== '') {
create(text);
TodoStore.emitChange();
}
break;
onStatusChange: function(status) {
this.setState({
currentStatus: status
});
},
componentDidMount: function() {
this.unsubscribe = statusStore.listen(this.onStatusChange);
},
一些Flux实现,例如创建它们的存储,新状态作为参数传递给侦听器函数
case TodoConstants.TODO_CREATE:
text = action.text.trim();
if (text !== '') {
create(text);
TodoStore.emitChange();
}
break;
onStatusChange: function(status) {
this.setState({
currentStatus: status
});
},
componentDidMount: function() {
this.unsubscribe = statusStore.listen(this.onStatusChange);
},
其他的实现,如随附的,允许您使用更具声明性的方法,直接将存储中的某些状态映射到组件上作为属性
// Which part of the Redux global state does our component want to receive as props?
function mapStateToProps(state) {
return {
items: state.items
}
}
var WrappedList = connect(mapStateToProps)(List)
// will receive items from redux state as a prop
<WrappedList />
//我们的组件希望作为道具接收Redux全局状态的哪一部分?
函数MapStateTops(状态){
返回{
项目:state.items
}
}
var WrappedList=connect(mapStateToProps)(列表)
//将作为道具从redux州接收项目
当状态更改时,状态的items部分将作为名为
items
的属性传递,您的组件将重新呈现。您没有“应用程序”组件吗?99%的React应用程序有一个父组件连接到某个DOM元素。您是否尝试将两个单独的组件连接到单独的元素?@azium Yea 2个组件到2个元素流量将是您的答案。两个组件都可以侦听同一存储以获取更新。