Мне нужно отобразить другой макет для одного и того же маршрута для указанного c URI с разными компонентами в зависимости от того, находится ли пользователь на мобильном или настольном компьютере.
Я бы хотел избежать проверки пути маршрута в PageCommon (компоненте макета), чтобы он оставался чистым.
В приложении есть главный компонент, заботящийся о макете, у него другой маршрутизатор- представления, в которых мы загружаем различные компоненты для каждого URI страницы. Это был бы нормальный путь для этого.
{
path: '',
component: PageCommon,
children: [
{
path: '',
name: 'Home',
components: {
default: Home,
header: Header,
'main-menu': MainMenu,
'page-content': PageContent,
footer: Footer,
'content-footer': ContentFooter
}
},
Я не могу изменить свойство компонентов маршрута после загрузки компонента, поэтому я попытался создать оболочку и передать компоненты динамически.
{
path: 'my-view',
name: 'My_View',
component: () => import('@/components/MyView/ViewWrapper')
},
In / components / MyView / ViewWrapper '
<page-common v-if="isMobile">
<my-mobile-view is="default"></my-mobile-view>
<main-menu is="main-menu"></main-menu>
</page-common>
<page-common v-else>
<my-desktop-view is="default"></my-desktop-view>
<header is="header"></header>
<main-menu is="main-menu"></main-menu>
<footer is="footer"></footer>
</page-common>
</template>
Я ожидал бы, что компоненты, переданные внутри общего блока страницы, будут заменены на соответствующие, но это не так работает, а Vue просто загружает компонент, общий для страницы, с пустыми представлениями маршрутизатора.
Есть ли для этого подход?
Обратите внимание, что я уже пробовал использовать свойство: is для загрузки различных компонентов, но тогда проблема заключается в том, как указать родителю использовать тот или иной компонент для этой страницы. Вот код для этого:
<template>
<component :is="myView"></component>
</template>
<script>
import DesktopView from "@/components/MyView/DesktopView";
import MobileView from "@/components/MyView/MobileView";
export default {
name: 'MyView',
components: {
DesktopView,
MobileView,
},
data(){
return {
myView: null,
isMobile: this.detectMobile()
}
},
methods : {
getViewComponent() {
return this.isMobile ? 'mobile-view' : 'desktop-view';
}
},
created() {
this.myView = this.getViewComponent();
}
}
</script>
Я мог бы использовать этот подход для каждого из PageCommon
представлений маршрутизатора, создав компонент для каждого, который выполняет вышеуказанное, но это выглядит как очень плохое решение.