使用react-meteor-data订阅

时间:2016-08-09 19:26:41

标签: javascript meteor reactjs

docs开始,我像这样写了我的容器

export default InventoryItemsList = createContainer(() => {
  const itemsCollection = Meteor.subscribe('allInventoryItems');
  const loading = !itemsCollection.ready();

  return {
    loading,
    items: !loading ? InventoryItems.find().fetch() : []
  };
}, class InventoryItemsListComponent extends Component {
  render() {
    let items = this.props.items;

    /* some render logic */

    return /*... react component template ...*/ ;
  }
});

我看到的问题是

  1. 容器函数执行多次,因此不止一次调用Meteor.subscribe;那很好吗? Meteor会忽略后续的订阅吗?
  2. 根据this tutorial,订阅需要停止,但文档根本没有提及。这不关心它自己,不是吗?
  3. 建议的停止(即取消订阅)或解决我从那一点看到的2个问题的方法是什么?

    TrackerRact实际上更好吗? (是的,我知道这是自以为是的,但肯定会有某种形式的流星反应会议,在这里!)

2 个答案:

答案 0 :(得分:1)

1)容器组件是一个反应组件,因此每当文档被更改或添加到给定集合时,它将通过您的容器调用并更新DOM。

2)据我所知,容器只会通过绑定它的实际组件订阅集合。离开该组件后,订阅应该停止。

如果您想直接取消订阅,只需在this.props.items.stop()方法中拨打componentWillUnmount()即可。

最后,我将不得不说使用React特定的实现总是比使用Meteor特定的函数更好(即使用React的Sessions使用状态变量总是更好,因为使用容器总是比Tracker.autorun()更好与React等等)。

答案 1 :(得分:0)

关于你的问题2),这就是我解决问题的方法

1-订阅某些内容时,请存储这些订阅引用并将其传递给组件。

这里有一个包含2个订阅但只订阅1个订阅的示例更加容易。

createContainer((props) =>{
  const subscription = Meteor.subscribe('Publication1', props.param1);
  const subscription2 = Meteor.subscribe('Publication2', props.param1, props.param2);
  const loading = !(subscription.ready() && subscription2.ready());
  const results1 = loading ? undefined : Collection1.find().fetch();
  const results2 = loading ? undefined : Collection2.findOne({a:1});
  return {subscriptions: [subscription, subscription2], loading, results1, results2};
}, MyComp);

然后在我的组件中:

class MyComp extends Component {
......
  componentWillUnmount() {
    this.props.subscriptions.forEach((s) =>{
      s.stop();
    });
  }
....
}

这样,组件将在props.subscriptions中获取在卸载之前需要停止的所有订阅。

你也可以使用this.props.loading来了解订阅是否准备就绪(当然,如果有帮助,你可以有2个不同的ready1和ready2)。

最后,在订阅后,如果您.find(),请不要忘记.fetch(),否则结果将不会被动。