我正在使用流星/反应,我有一个主要容器的任务组件,我在任务上订阅。现在,在子组件上,我显示任务,但我希望有一个下拉列表来排序任务(createdAt,Name等...)流星/反应,通过CreateContainer和子组件传递状态?
我使用Session with Blaze做了这个,但在这里, m使用React,它看起来工作不一样。我不知道如何使排序任务列表反应。我现在想做的事情(我不知道这是否是好方法)是在应用程序组件中设置状态并将其发送给容器和子级。
AppClass
constructor(props){
super(props);
this.state = this.getMeteorData();
this.sortTasks = this.sortTasks.bind(this);
}
getMeteorData(){
return {
sorting: { createdAt: -1 },
};
}
sortTasks(sorting) {
this.setState({ sorting: sorting });
}
render(){
const childrenWithProps = React.Children.map(this.props.children, (child) =>
React.cloneElement(child, {
sorting: this.state.sorting,
sortTasks: this.sortTasks.bind(this),
})
);
return <div>{childrenWithProps}</div>
}
集装箱
export default TodosContainer = createContainer(({props}) => {
Meteor.subscribe('tasks');
return {
tasks: Tasks.find({}, { sort: props.sorting }).fetch(),
sorting: props.sorting,
sortTasks: props.sortTasks,
};
}, TodosPage);
TodosPage
const propTypes = {
....
sorting: PropTypes.string.isRequired,
}
render() {
return (
...
{(() => {
if (this.state.listSelected) {
return (
<TaskPanel
tasks = {this.props.tasks}
sorting = {this.props.sorting}
sortTasks = {this.props.sortTasks}
/>
);
}
})()}
而经过时,T问面板,孩子TodosPage的:
const propTypes = {
....
sorting: PropTypes.string.isRequired,
}
handleSelect(event, sorting) {
switch(event) {
case 1: return this.props.sortTasks({ createdAt: -1 });
case 2: return this.props.sortTasks({ createdAt: 0 });
};
}
render() {
return (
<DropdownButton
onSelect={(event, sorting) => this.handleSelect(event, this.props.sorting)}
<MenuItem eventKey="1">Created Date Asc</MenuItem>
<MenuItem eventKey="2">Created Date Desc</MenuItem>
</DropdownButton>
...
{this.renderTasks()}
...
最后一点,路线:
<Route path="/admin" component={AdminAppContainer}>
<IndexRoute component={AdminMainContainer}/>
<Route path="todos" component={TasksContainer}>
<Route path=":listId" component={TodosPage}/>
</Route>
</Route>
这里是impricated部件......另外,我只需要在状态 “排序”在这个TasksContainer中,但不在AppClass的其他孩子中......我可以只将这个状态分配给这个孩子吗?
感谢您的帮助:)
嘿@Max G.,这正是我试图做的,但我有一个问题,我不能更新状态的方法...我编辑我的帖子 – guillaumek
好吧,我看到它更好现在。你有什么错误?控制台中的任何东西?我注意到的一件事,虽然可能不是问题,但在TodosContainer中,您的函数将'{props}'作为参数。我*认为* createContainer在顶层提供道具,*即* createContainer((道具)=> {})'。有了wat,你实际上是在寻找'props.props',这可能导致未定义。但在这种情况下,你应该在控制台中看到它。另外,我假设你正在'App'中调用'TodosContainer'? –
不,我不在控制台中有任何不幸的东西。看起来我可以通过我的state.sorting到相关的孩子,因为console.log显示结果。但是,函数sortTasks不起作用:我没有错误消息,但它什么都不做。此外,我试图从参数删除道具和做:this.props.sorting在容器中,但它不是在控制台中工作我有:排序是未定义的。我编辑帖子向你展示路线,这是容器被调用的地方。非常感谢你 – guillaumek