我正在使用Meteor与React JS。 我收到了" list"通过此代码,
Meteor.subscribe('getList', {status:'active'},function(){
self.setState({lists:Lists.find().fetch()});
});
以下是发布代码,
Meteor.publish('getList', function(data){
data.user = this.userId;
return Lists.find(data);
});
所以它正在发挥作用。问题是我有两个组件调用Meteor.subscribe(' getList')。但状态不一样。
所以在其他组件中,我有这个代码,
Meteor.subscribe('getList', {status:'archived'},function(){
self.setState({lists:Lists.find().fetch()});
});
所以这里发生的是,如果用户转到FirstComponent,this.state.lists为空(这是正确的)。然后,当用户导航到SecondComponent时,this.state.lists将填充数据(这是正确的)。但是当用户返回到FirstComponent时,this.state.lists仍然填充了数据(这是错误的)。
就像客户端中的第一个集合(空)仍然存在。然后添加第二个集合(非空)。我想在再次订阅之前清除客户端中的集合。
顺便说一句,我使用的是flow-router。
答案 0 :(得分:1)
看起来您正在Meteor.subscribe onReady回调中设置React状态。每个组件是否都拥有自己的状态?
你在哪里打电话给Meteor.subscribe?请记住,Meteor将订阅数据放在本地mini-mongo中,当您调用Lists.find()时,您正在那里阅读。
您设置此方法的方式,数据不会被动。您需要将句柄存储到Meteor.subscribe游标并使用它来管理订阅生命周期。
如果您可以分享更多代码,我可以给出更简洁的答案。
答案 1 :(得分:1)
由于订阅是累积的,因此您应该在setState
函数中重复查询条件:
let query = {status:'active'};
Meteor.subscribe('getList',query,function(){
self.setState({lists:Lists.find(query).fetch()});
});
query = {status:'archived'};
Meteor.subscribe('getList',query,function(){
self.setState({lists:Lists.find(query).fetch()});
});
但请注意,从安全角度来看,您确实不希望将(不受信任的)客户端中的查询对象作为参数传递给订阅!从控制台有人可以做:
Meteor.subscribe('getList',{});