React Meteor withTracker数据到达后如何执行功能?

时间:2018-07-05 08:57:13

标签: reactjs meteor

我正在从服务器发布数据,并使用withTracker进行捕获。

    export default withTracker(() => {
     let towndatasub = Meteor.subscribe("userTownDataPublisher",Meteor.userId());
  let resourcedatasub = Meteor.subscribe("userResourcePublisher",Meteor.userId());

      return{
    townData : Towns.find({"ownerId":Meteor.userId()}).fetch(),
    resourceData : Resources.find({"ownerId":Meteor.userId()}).fetch()

      }

    })(TownPage);

问题是我想在TownData和resourceData到达时运行一个函数。如果我在componentDidMount中调用updateResources,则会在this.props.componentWillReceive道具上获得未定义的内容,而该道具未称为.townData和this.props.resourceData

updateResources = () =>{



Meteor.call("updateUserResources",Meteor.userId(),(err,result)=>{
if(err){
  console.log(err)
}else{
  console.log("asdasd");

      //console.log(this.props.resourceData); undefined
      // here i will do something with this.props.resourceData

}

})
      }

所以我应该在哪里调用updateResources函数以获取未定义的信息?

1 个答案:

答案 0 :(得分:2)

首先,componentDidMount仅在加载页面时被调用一次,紧接在对render的第一次调用之后。因此,您不应该在那里呼叫updateResources,因为到那时集合可能还没有完成从服务器的加载。我建议在render中调用它,因为render在数据到达之前将被调用一次,在数据到达之后将被调用一次。

第二,如果您想更准确地知道数据何时到达,则可以在withTracker中返回另外两个涉及ready函数的属性,

export default withTracker(() => {
    let towndatasub = Meteor.subscribe("userTownDataPublisher",Meteor.userId());
    let resourcedatasub = Meteor.subscribe("userResourcePublisher",Meteor.userId());

    return{
        townData : Towns.find({"ownerId":Meteor.userId()}).fetch(),
        resourceData : Resources.find({"ownerId":Meteor.userId()}).fetch(),
        townsReady : towndatasub.ready(),
        resourcesReady : resourcedatasub.ready()
    }

})(TownPage);

然后在渲染中,仅当数据到达时才可以调用updateResources

if(this.props.townsReady && this.props.resourcesReady) {
    this.updateResources();
}