Я столкнулся с непротиворечивым поведением в vue.js и не смог найти никакой документации, описывающей его, и я хотел бы знать, ожидается ли это поведение или нет.
Я разрабатываю SPA с использованием vue.js 2.6.8, @ vue / cli-service 3.5.1 и vue-router 3.0.1.
Мои маршруты выглядят так:
{
path: '/Users',
name: 'Users',
component: Users,
meta: {requiresAuth: true},
children: [
{
path: 'New',
component: NewUserModal,
name: 'NewUserModal',
meta: {requiresAuth: true},
}
]
},
{
path: '/Users/:id',
component: User,
name: 'User',
meta: {requiresAuth: true}
}
Компонент Users представляет собой список пользователей, в котором имеется представление маршрутизатора для визуализации модального пользователя, выглядящего следующим образом:
<template>
<my-list-component>
<template #modal>
<router-view/>
</template>
</my-list-component>
</template>
Внутри этого компонента пользователь может нажать кнопку, чтобы протолкнуть новый маршрут, NewUserModal , затем отображается модальный режим, в котором можно создать нового пользователя, а после завершения операции происходит еще одно нажатие маршрутизатора, поэтому пользователь перенаправляется на маршрут Пользователь . Короче говоря:
Пользователи -> NewUserModal -> Пользователь
Все этапы NewUserModal происходят, он действительно разрушен. Однако, если я когда-нибудь вернусь к компоненту Users, элемент DOM в NewUserModal все еще будет там, поэтому я вижу DOM уничтоженного дочернего компонента на родительском элементе.
У меня сложилось впечатление, что изменение маршрута произошло "слишком быстро", и когда вызывается метод уничтожения компонента NewUserModal, элемент DOM, который необходимо уничтожить, больше не присутствует на странице, поэтому он не может его удалить.
В качестве обходного пути я поместил следующий код внутри NewUserModal:
beforeDestroy() {
this.$el.remove();
},
И все работает просто отлично. Итак, это ожидаемое поведение vue? Я что-то пропустил? И что еще более важно, я могу ждать удаления DOM прежде, чем изменить маршруты?
Спасибо за ваше время и помощь!
Редактировать 1
Для лучшего понимания мой app.vue поддерживает работу, поэтому все прямые потомки (например, списки пользователей и т. Д.) Не отправляют запрос на сервер каждый раз, когда активируются. Структура App.vue выглядит следующим образом:
<template>
<keep-alive>
<router-view/>
</keep-alive>
</template>
Редактировать 2
В некоторых дальнейших тестах я обнаружил, что обходной путь не работал в 100% случаев, поэтому я изменил обходное решение на это:
async redirectToUser(userId) {
this.$router.push({name: 'Users'});
await this.$nextTick();
this.$router.push({
name: 'User',
params: {id: userId}
});
},
Таким образом, я сначала перенаправляю пользователя к родительскому компоненту, поэтому жизненный цикл дочернего компонента полностью выполняется, а его элементы DOM удаляются, а затем пользователь перенаправляется на компонент User.
Пока работает 100% времени.