反应流星数据 - 使用withTracker时,组件不会使用新数据重新渲染

时间:2018-03-15 01:02:50

标签: javascript mongodb reactjs meteor react-router

我正在使用Meteor,React,react-meteor-data和React Router。我链接到一个页面并添加一个/:id,然后我尝试使用它来查询数据库并使用返回的数据构建组件。

问题是初始查询返回一个空数组。然后我可以在我的render方法和componentWillReceiveProps中看到它返回我稍后期望的数据。问题是我的组件没有重新渲染。我正在使用withTracker,因为我希望每次数据库在目标Collection中更改时,组件都会更新并重新呈现。

以下是客户端的React代码:

export default withTracker((props) => {
    const handle = Meteor.subscribe('game', props.match.params.id);
    return {
        listLoading: !handle.ready(),
        game: ActiveGames.find({ _id: props.match.params.id}).fetch(),
    };
})(Game);       

以下是' imports / api / activeGames.js'中的出版物:

import { Meteor } from 'meteor/meteor';
import { Mongo } from 'meteor/mongo';
import { check } from 'meteor/check';

export const ActiveGames = new Mongo.Collection('activeGames');

if (Meteor.isServer) {
   Meteor.publish('game', function (id) {
      check(id, String);
      return ActiveGames.find({ _id: id });
   });

   Meteor.publish('activeGames', function activeGamesPublication() {
      return ActiveGames.find();
   });
}

以下是我获得的输出的屏幕截图,其中包含用于跟踪相关生命周期方法的控制台日志。

Console Log of Component Loading

1 个答案:

答案 0 :(得分:0)

我相信使用listLoading prop做一些简单的事情。 例如,您的游戏组件可能是:

enum TextEditEvent{
case editingBegin(UITextField)
case editingEnd(UITextField, UITextField?)
case textChanged<T>(String?, UILabel?, T, String) where T:Object, T:Updatable
}

这就是我处理订阅和接收数据之间的时间。

希望它有所帮助,虽然我确定你现在找到了解决方案;)