2016-08-09 3 views
0

Из 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 больше чем единожды; это хорошо? Будет ли Метеор просто игнорировать последующие подписки?
  2. Согласно this tutorial, подписка должна быть остановлена, но документы не упоминают об этом вообще. Это не позаботится об этом, не так ли?

Каков рекомендуемый способ остановки (то есть отказаться от подписки) или решить 2 проблемы, которые я вижу с этой точки?

Действительно ли TrackerRact лучше? (да, я знаю, что это упрямый, но, конечно, здесь есть какая-то форма конвенции с метеорными реакциями!)

ответ

1

1) Контейнерный компонент является реактивным компонентом, поэтому всякий раз, когда документы меняются или добавляются к данный сбор, он будет звонить через ваш контейнер и обновлять DOM.

2) Насколько я знаю, контейнер будет только подписываться на коллекцию через фактический компонент, с которым вы его связываете. Как только вы покинете этот компонент, подписка должна прекратиться.

Если вы хотите отказаться от подписки напрямую, вы можете просто позвонить this.props.items.stop() в ваш метод componentWillUnmount().

Наконец, я должен буду сказать, что использование конкретных реализаций React всегда лучше, чем использование специальных функций Meteor (т.е. всегда лучше использовать переменные состояния над Session with React, так как всегда лучше использовать контейнеры, чем Tracker.autorun () с реактивом и т. д. и т. д.).

+0

«подписка должна прекратиться». Ну, мне кажется, что это анти-шаблон, как описано в документах Meteor. Я не уверен, что это на самом деле останавливается волшебно. Что вы подразумеваете под «использованием конкретных реакций React»? Не могли бы Вы уточнить? –

+1

То, что я подразумеваю под конкретными реализациями React, - это методы и свойства, которые являются родными для React. Например, лучше использовать переменные состояния, чем использовать переменные сеанса. Реакция была специально разработана с использованием состояний, поэтому она всегда будет работать лучше для вашего приложения, используя их вместо переменных сеанса или реактивных переменных. –

+0

То же самое с контейнером для подписки. Не цитируйте меня на этом, но я считаю, что компонент контейнера был разработан MDG для реактивности и простой способ подписаться на данные в ваших компонентах на Meteor. Поэтому всегда лучше использовать это, чем Tracker. Даже не уверен, как вы получите трекер для работы в этом случае с React. –

0

О вашей проблеме 2), это, как я решить

1- При подписке на то, хранить эти подписки ссылки и передать их к компоненту.

Здесь пример с двумя подписками, но подписывается только на 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(), иначе результаты не будут реагировать.

+0

FWIW Теперь я использую [Менеджер подписки] (https://github.com/kadirahq/subs-manager) для большинства моих подписчиков. Я реализовал кеш-менеджер подписки, чтобы иметь доступ к различным менеджерам в разных частях приложения, и это, похоже, работает как шарм. Я практически не нуждаюсь в 'createContainer' и вместо этого использую элементы [ListContainer] (https://github.com/meteor-utilities/react-list-container). –