从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 ...*/ ;
}
});
我看到的问题是
Meteor.subscribe
;那很好吗? Meteor会忽略后续的订阅吗?建议的停止(即取消订阅)或解决我从那一点看到的2个问题的方法是什么?
TrackerRact实际上更好吗? (是的,我知道这是自以为是的,但肯定会有某种形式的流星反应会议,在这里!)
答案 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()
,否则结果将不会被动。