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