#javascript #typescript #vue.js #vue-router
Вопрос:
Версии:
"dependencies": {
"@types/node": "^16.7.4",
"core-js": "^3.6.5",
"vue": "^3.0.0",
"vue-class-component": "^8.0.0-0",
"vue-router": "^4.0.0-0",
"vuex": "^4.0.0-0"
},
Итак, я создавал онлайн-портфолио SPA в Vue3, и я столкнулся с этой проблемой с самого начала. Я использую текущий маршрут, чтобы инициировать переход на моем головном компоненте. На самом деле эта часть не важна.
Всякий раз , когда я перехожу к /
, this.$route.fullPath
выглядит нормально.
Однако, если я, например , перейду на один из других маршрутов в своем приложении /webdev
, а затем обновлю и проверю this.$route.fullPath
еще раз, это произойдет /
вместо /webdev
того, как я ожидал.
Таким образом, пока я не обновляю, переход заголовка работает должным образом; однако, как только я обновляю маршрут , которого нет /
, маршрутизатор Vue забывает, где я был, и вместо этого думает, что я нахожусь на базовом пути /
.
src/router/index.ts
import { createRouter, createWebHistory } from "vue-router";
import Home from "../views/Home.vue";
import WebDev from '../views/WebDev.vue';
import SoundDesign from '../views/SoundDesign.vue';
export default createRouter({
history: createWebHistory(),
routes: [
{
path: '/',
name: 'Home',
component: Home,
},
{
path: '/webdev',
name: 'Web Dev',
component: WebDev,
},
{
path: '/sounddesign',
name: 'Sound Design',
component: SoundDesign,
},
{
path: '/:catchAll(.*)*',
name: 'Home',
component: Home,
}
],
});
src/App.vue
<template>
<div class="page-container">
<div class="content">
<HeaderComponent :condenseHeader="condenseHeader"></HeaderComponent>
<main>
<router-view v-slot="{ Component }">
<transition
name="fade"
mode="out-in"
@before-leave="beforeLeave"
appear
>
<component :is="Component"></component>
</transition>
</router-view>
</main>
</div>
<FooterComponent></FooterComponent>
</div>
</template>
<script lang="ts">
import { defineComponent } from 'vue';
import HeaderComponent from './components/HeaderComponent.vue';
import FooterComponent from './components/FooterComponent.vue';
export default defineComponent({
name: 'App',
components: {
HeaderComponent,
FooterComponent,
},
data: () => ({
condenseHeader: false,
}),
beforeMount() {
this.setCondenseHeader();
},
methods: {
beforeLeave() {
this.setCondenseHeader();
},
setCondenseHeader() {
this.condenseHeader = this.pathNotHome;
},
},
computed: {
pathNotHome() {
return this.$route.fullPath !== '/';
},
},
});
</script>
Я уже пробовал оба типа истории в файле маршрутов, так как читал, что режим истории браузера HTML5 может вызвать 404 при перезагрузке, но я не получаю 404 — содержимое страницы остается таким же, как и до перезагрузки, но this.$route
, похоже, сбрасывается или выходит из строя, или что-то в этом роде.
Если я не делаю что-то не так, я удивлен, что на данный момент это ошибка в Vue.
Комментарии:
1. @Фил, это происходит как на моем локальном хостинге, так и на самом сайте. итак, местные и производственные
2. вы следуете резервной настройке, о которой говорится в документах? next.router.vuejs.org/guide/essentials/history-mode.html
3. @LawrenceCherone У меня есть
catchAll
маршрут в файле маршрутов. Хотя у меня нет серверного узла/экспресс-настройки, как на странице. Я не знал, что это нужно для того, что я делал.4. @Фил Да, когда я запускаю репо локально. У меня нет кода сервера Node/Express — только это репо. Я не знал, что это было необходимо.
5. Что касается конфигурации сервера, если вы развертываетесь в Netlify, я считаю, что ваш
_redirects
файл-это все, что вам нужно , поэтому вы должны быть хороши на этом фронте
Ответ №1:
Я думаю, что вся проблема связана со временем.
Вы condenseHeader
изначально устанавливаете в своем App
компонентном beforeMount
крючке. Я предполагаю, что, когда этот крючок срабатывает при начальной загрузке страницы, путь маршрута не был разрешен.
Что бы я сделал вместо этого, так это сделал condenseHeader
реактивным, сделав его вычисляемым свойством
computed: {
condenseHeader () {
return this.$route.fullPath !== '/';
}
}
Кроме того, в соответствии с корпусом опоры (чехол для верблюда против чехла для шашлыка), ваш condenseHeader
атрибут должен быть condense-header
…
<HeaderComponent :condense-header="condenseHeader" />
Комментарии:
1. Вау. Я действительно думаю, что это сработало. Ay ay ay. Я никогда не думал, что это может быть проблемой времени. Большое тебе спасибо, Фил. Вопрос — будет ли здесь лучше вычисляемое свойство или свойство просмотра? Я не выполняю вычисления или преобразования, вместо этого я просто наблюдаю за определенным значением. Кроме того, должным образом отмечено в комментарии к делу о шашлыке. Я вернусь и изменю все attrs в своем репозитории.
2. Я думаю, что общее мнение состоит в том, чтобы предпочесть вычисляемые свойства наблюдателям (по крайней мере, это было в Vue 2). В любом случае, учитывая, что вы хотите использовать результат сравнения в своем шаблоне, я думаю, что это идеальный вариант использования для вычисленных
3. Попался. Тогда я воспользуюсь вычисляемым свойством для этого. Проблема решена. Еще раз спасибо!