You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Нажать на кнопку Destroy b-dummy (это уничтожит b-virtual-scroll)
Нажать на кнопку Reload all components
ФР: получена ошибка TypeError: Cannot use 'in' operator to search for 'getRoot' in undefined
Пояснение к багу
Есть b-virtual-scroll, внутри него рендерится компонент (b-dummy) внутри которого есть другой компонент (b-remote-provider) с v-once
При уничтожении b-virtual-scroll, уничтожается только b-dummy, а b-remote-provider продолжает жить (утечка памяти)
P.s. если удалить v-once, то vue.unmount() удалит и b-remote-provider.
Если бы не было вызова vue.unmount, то продолжали бы жить вообще все внутренние компоненты b-dummy, так как b-virtuall-scroll вызывает destroy только непосредственно у item'а.
Проблема оказалась куда серьезнее - это баг на уровне Vue, вот пример в песочнице. Надо открыть консоль и покликать на кнопку "Change state", будет видно, что с каждым переключением количество событий растет, потому что не отрабатывает unmount.
Также есть баг в репозитории Vue. Можно заменить v-once на v-memo=[] - функционально это тоже самое, однако Vue при этом вызывает unmount для таких узлов.
Дополнительно поизучал внутри vue и что под капотом у v-once.
Как только встречается эта директива, то в целях оптимизации он перестает добавлять всех детей в dynamicChildren, поскольку считает что там дальше статичный контент который не должен меняться. Это сделано чтоб даже не ходить внутрь и не пытаться апдейтить что-либо при изменениях.
Есть у этого наблюдаемый сайдэффект что дальше даже при удалении не вызываются анмаунты, поскольку он даже не знает для кого их вызвать.
Это справедливо не только для самого компонента на котором v-once, но и для всего дерева дочерних узлов в шаблоне.
Наши компоненты вовсе нельзя использовать с v-once, поскольку для них никогда не будет вызван деструктор и соответсвенно будет течь async
Как воспроизвести баг
Destroy b-dummy
(это уничтожит b-virtual-scroll)Reload all components
ФР: получена ошибка
TypeError: Cannot use 'in' operator to search for 'getRoot' in undefined
Пояснение к багу
b-virtual-scroll
, внутри него рендерится компонент (b-dummy) внутри которого есть другой компонент (b-remote-provider) с v-onceb-virtual-scroll
, уничтожается толькоb-dummy
, аb-remote-provider
продолжает жить (утечка памяти)P.s. если удалить v-once, то
vue.unmount()
удалит иb-remote-provider
.Если бы не было вызова
vue.unmount
, то продолжали бы жить вообще все внутренние компоненты b-dummy, так какb-virtuall-scroll
вызываетdestroy
только непосредственно у item'а.Дифф: https://github.com/V4Fire/Client/compare/v4...examples/1217?expand=1
The text was updated successfully, but these errors were encountered: