2015-09-21 4 views
1

У меня есть приложение, которое получает сообщения с сервера каждые 1 секунду и через socket.io эти сообщения передаются в компонент реакции.Реагирование на изменения частоты в React.js/Flux

Мой компонент реагирования использует архитектуру стиля потока, поэтому он вызывает действие, когда получено сообщение, которое добавляет (или обновляет) запись в коллекции в магазине.

Мой компонент отслеживает изменения в магазине, а затем обновляет пользовательский интерфейс при его изменении. В этом случае он рисует маркер на карте.

Проблема в том, что из-за частоты обновлений мой компонент перерисовывает все маркеры каждую секунду, чего я не хочу.

Я ищу подход, позволяющий моему компоненту карты отвечать на изменения в коллекции в магазине, но не обновлять состояние каждую секунду.

Я думал, что у меня может быть коллекция необработанных данных, а затем выборочно обновлять коллекцию networkGPS выборочно в моем магазине, но компонент, похоже, изменяется на основе любого свойства в магазине, поскольку все они, похоже, являются частью его государство.

Резюмируя Я ищу:

  • Собирать данные каждую 1 секунду в сыром виде и добавить эти данные в хранилище.
  • Привязать компонент к коллекции в этом магазине, которую я обновляю только тогда, когда изменения требуют перерисовки интерфейса.

То, что я думаю, что нужно сделать:

Либо:

  • Избегайте ввода исходных данных в состояние магазина (на данный момент я не уверен, как объявить коллекцию, которая не является частью государства)

OR

  • Сделайте мой компонент более умным относительно того, когда он перерисовывается, поэтому он не пытается перерисовывать при каждом изменении состояния.

Я не уверен, что является наиболее подходящим решением проблемы, любая информация будет с благодарностью получена.

Извините, если вопрос немного неясен, я новичок в реакции/флюсе. Пожалуйста, просите о любых разъяснениях.

EDIT

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

Это не идеальный вариант, я чувствую, что должен иметь возможность разрешить моему компоненту отвечать только на определенные изменения состояния, но я еще не нашел его, все еще ищу лучшего ответа.

+0

Не могли бы вы рассказать о том, как «эти сообщения передаются в реагирующий компонент»? – shashi

+0

Конечно, на данный момент у меня есть соединение с сторонним аппаратным компонентом, у которого есть событие «данных». На этом событии я анализирую информацию на сервере, создаю разумно форматированный json-объект и 'io.sockets.emit (data)' данные. Мой клиент-клиент слушает сообщение socket.io, и когда он получает данные, он вызывает метод действия updateGPSData (data) '. Этот метод выталкивает данные в пару массивов в хранилище. Массивы являются частью состояния магазинов, поэтому, когда они обновляются, изменяется состояние моего реагирующего компонента и вызывается метод рендеринга с новыми данными. – dougajmcdonald

ответ

1

Я не совсем уверен, в чем проблема, с которой вы сталкиваетесь с обновлениями каждую секунду.

Однако одно место, где вы можете поставить очередь обновлений, находится между socket.io и вызывает действие.

Вместо того чтобы вызывать действие каждую секунду, вы можете поставить очередь обновлений, прежде чем отправлять их, чтобы реагировать.

+0

Проблема с 1-секундным обновлением заключается в том, что я скажу 100 маркеров на карте, и я только хочу обновить рендеринг, возможно, 1 или 2 в секунду (на основе свойств полученных данных). Хотя я мог бы поставить очередь данных из socket.io, мне нужно обновлять данные в магазине с помощью других свойств каждую секунду. Кроме того, входящие данные не являются чем-то, что я контролирую напрямую, поэтому перехват сообщений и их ретрансляция условно приведут к дополнительной обработке и логике, которые я бы хотел избежать, если это вообще возможно. – dougajmcdonald

2

Есть несколько способов подойти к этому:

1) Используйте shouldComponentUpdate для сравнения старых и новых реквизита реквизита, повторный рендеринг только новые состояния маркеров.

2) Переход к дереву состояний на основе курсора, который автоматически запускает рендеринг только для представлений, привязанных к определенным частям дерева состояний, которые были изменены. Я считаю, что Baobab - одна из таких библиотек. См. Также Om (написанный на ClojureScript) и, возможно, ряд других реализаций Flux.

Учитывая влияние №2, мой голос должен был пройти по маршруту №1.

+0

Привет, glortho, # 1, безусловно, был подходом, который я изучал, хотя мне кажется, что я разрешаю решить, нуждается ли весь компонент в обновлении или нет. Вы предположили бы, что, возможно, используя 'shouldComponentUpdate', чтобы решить, изменилась ли какая-либо из записей, и если это правда, возможно, используя метод рендеринга для перебора коллекции и решить, какие записи нужно переместить/нарисовать? В настоящий момент мой метод render просто рисует всю коллекцию. – dougajmcdonald

+0

Есть несколько уровней, на которые должен работатьComponentUpdate. Один из них касается компонента, который отображает коллекцию в целом, как вы сказали. Вы можете сравнить старую и новую коллекцию, чтобы увидеть, изменилось ли что-либо, хотя, если ничего не изменилось, функции рендеринга должны быть относительно недорогими, так как они не будут касаться DOM. Или вы можете обернуть отдельные маркеры в свой собственный компонент и проверить старый vs новый маркер в методе shouldComponentUpdate. – glortho

Смежные вопросы