我试图通过将集合名称作为prop来编写一个React组件来订阅服务器上的数据。 (在示例中,名称仍然是硬编码以保持简单)由于集合名称可以动态更改,因此我调用方法来构造发布和服务器集合变量。现在的理论是在父组件中构造数据发布,服务器和客户端mongo集合变量,并在子组件中订阅此发布。父组件的设置如下:
export default class TilesSingle extends TrackerReact(Component) {
newDataCollection(){
Meteor.call("setupData","randomcollectionname");
if(!window["randomcollectionname"]){
window["randomcollectionname"] = new Meteor.Collection("randomcollectionname");
}
}
render(){
this.newDataCollection();
return(
<div>
<DataObject />
</div>
)
}
}
setupData方法如下所示:
Meteor.methods({
setupData(collectionname){
if(!global[collectionname]){
global[collectionname] = new Meteor.Collection(collectionname);
Meteor.publish("pub."+ collectionname,function() {
return global[collectionname].find();
});
}
}
})
子DataObject组件如下所示:
export default class DataObject extends TrackerReact(Component) {
constructor(){
super();
this.state = {
subscription: {
tiledata: Meteor.subscribe("pub.randomcollectionname"),
}
}
}
componentWillUnmount(){
this.state.subscription.tiledata.stop();
}
findData(){
post = window['randomcollectionname'].findOne();
console.log(post)
return post;
}
render(){
obj = this.findData();
if(!obj){
obj = {};
obj["score"] = 0;
}
return(
<div>
<h4>{obj.score}</h4>
</div>
)
}
}
请注意,我在findData()函数中记录了帖子。刷新时,控制台会记录:
undefined
undefined
> Object {..}
> Object {..}
undefined
undefined
这几乎就像订阅有效,然后停止工作。我认为它与响应呈现这些组件的顺序有关,并且在客户端尝试呈现子组件时,该方法尚未在服务器上完成。任何想法?