V4Fire / Client

V4Fire client core library
MIT License
23 stars 15 forks source link

fix(i-block/activation): reload for unloaded component or with `reloadOnActivation` #1475

Closed ItMaga closed 1 week ago

ItMaga commented 2 weeks ago

Описание проблемы

Мы перед созданием компонента вызываем initLoad, до его завершения мы покидаем страницу, если ещё точнее, нас волнует поле isReadyOnce, оно остается false. Затем возвращаемся на эту страницу, мы попадаем в onActivated и регистрируем setImmediate https://github.com/V4Fire/Client/blob/503435cdc7e12edf2236a63dc01253c4115f909d/src/components/super/i-block/modules/activation/index.ts#L185 после этого продолжается запрос initLoad и выставляется isReadyOnce = true. После чего вызывается колбэк из setImmediate, который в зависимости от isReadyOnce вызывает либо reload, либо initLoad https://github.com/V4Fire/Client/blob/503435cdc7e12edf2236a63dc01253c4115f909d/src/components/super/i-block/modules/activation/index.ts#L199-L201

В reload у нас в i-data есть (await this.remoteState.net.isOnline()).status, и после вызов super.reload(). https://github.com/V4Fire/Client/blob/503435cdc7e12edf2236a63dc01253c4115f909d/src/components/super/i-data/i-data.ts#L265-L269

И до вызова super.reload, у нас происходит ререндер, так как данных нет и мы скрываем b-virtual-scroll через v-if, происходит его дестрой и затем мы доходим до super.reload который как раз падает с ошибкой, так как компонент уже уничтожен

Стектрейс ошибки

TypeError: Cannot read properties of undefined (reading 'lfc')
  at initLoad (https://cb.edadeal.ru/v2:90:615779)
  at Proxy.s (https://cb.edadeal.ru/v2:90:1316714)
  at Object.reload (https://cb.edadeal.ru/v2:90:759712)
  at Object.reload (https://cb.edadeal.ru/v2:90:1230091)