Реактивная (реагирующая-нативная) анимация - частичное размонтирование компонента - PullRequest
0 голосов
/ 01 ноября 2019

Я имею дело с проблемой, связанной с жизненным циклом React. Эта проблема возникает в приложении-родном приложении, которое использует анимации react-navigation-stack и react-navigation-tabs.

. Я создал собственную библиотеку событий pub-sub, которую я использую в своем приложении-нативном приложении. Я не могу опубликовать код этой библиотеки (как из-за длины кода, так и по причинам авторского права бизнеса), но я могу дать вам описание этого.

В библиотеке есть 5 основных методов:

  • publish: создает новое событие с некоторыми спецификациями (например, одноразовые события)
  • subscribe: добавляет функцию прослушивания события к событию
  • emit: вызывает все прослушиватели событий, добавленные по подписке (в том же порядке, что и добавленные)
  • unsubscribe: удаляет функцию прослушивателя из события
  • withdraw:удаляет событие, созданное с помощью команды publish

На события ссылается имя события (простая строка), а имена событий уникальны в течение жизненного цикла (вы не можете публиковать событие «PRESSED», если есть другоеодно уже опубликовано - вы можете сначала удалить существующее событие, а затем снова опубликовать какое-либо другое событие «PRESSED».

Жизненный цикл события в точности соответствует порядку, в котором я перечислил методы, приведенные выше.

Библиотека событий не использует реакцию или состояние и находится за пределами области действия реакции. Он определяется и создается в своем собственном файле и экспортирует только один экземпляр (const) самого себя.

Мне нужно, чтобы он работал таким образом, чтобы отправлять события в дереве в какой-либо родительский компонент (родитель может вызвать setState () и изменить состояние очевидным образом - это и есть желаемый эффект).

Для использования я publish -ing и subscribe -ing к событиям на componentDidMount метод родительского компонента, emit -ing только из дочернего компонента и unsubscribe -ing и withdraw -ing из метода componentWillUnmount только родительского компонента.

Now, к вопросу:

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

Это приводит к сбою публикации при повторном монтировании (поскольку существуют события, уже опубликованные с таким именем), тогда componentWillUnmount of before отменит подписку и отменит события, затем дочерние компоненты не смогут генерировать события,и, наконец, перемонтированный компонент не сможет отменить подписку и отозвать события, которые не были опубликованы.

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

...