Хранилище Vuex сбрасывается в исходное состояние при обновлении sh страницы, подобно тому, как обычная страница сбрасывается в исходное состояние при обновлении sh. Чтобы сохранить (часть) магазина Vuex, вам нужно использовать плагин для этого. Вы можете использовать, например, vuex-persistedstate .
. Хотя это может помочь, если вы обновите sh, очевидно, что вы ничего не сделаете, если, например, щелкните ссылку на кусок в другом проекте.
Другое дело, что когда вы переопределите sh, и у вас есть маршрут в строке URL, который указывает на маршрут PieceShow
, маршрутизатор Vue не будет посещать ProjectShow
вообще.
Вы всегда должны строить свои взгляды, зная, что кто-то, возможно, не посещал какой-либо другой маршрут. Тем не менее, есть несколько способов, которыми вы можете обойти, просто продублировав код для извлечения проекта.
Вы можете переместить код для извлечения вашего проекта в действие Vuex. Если проект уже загружен, просто вернитесь рано, в противном случае получите проект. Защитите себя от несуществования, используя v-if
в вашем компоненте, чтобы он не отображался до загрузки проекта. В этом случае вы даже можете показать загрузчик на основе переменной, которую вы поместили в хранилище vuex.
Другой способ - это вложить ваши маршруты так, что у вас есть маршрут для /projects/:projectId
и один для подчиненный маршрут pieces/:pieceId
. В представлении для /projects/:projectId
вы можете сделать что-то вроде ниже. В вашем маршрутизаторе. js вы можете определить атрибут children
с подмартом, который будет смонтирован в представлении маршрутизатора для /projects/:projectId
.
<template>
<router-view v-if="currentProject" />
</template>
<script>
export default {
computed: {
currentProject() {
return this.$store.state.currentProject
}
},
created () {
const response = await PiecesService.getPieceById({
id: this.$route.params.piece_id
})
const project = response.data
this.$store.commit("setCurrentProject", project);
}
}
</script>
.