Как показать компоненты на правой стороне NavigationDrawer Vuetify, используя VueRouter? - PullRequest
0 голосов
/ 17 января 2020

В моем проекте VueJS у меня есть механизм показа контента на основе входа в систему с использованием Firebase и состояния (vuex), если пользователь вошел в систему, содержимое показывается с использованием v-if. Итак, в этот момент я могу поставить NavigationDrawer в правильном месте, но не могу показать компоненты в правильном месте. Цель - показать фиксированный NavigationDrawer слева и страницы (компоненты) справа, перейдя к ним с помощью VueRouter. В настоящее время проект работает нормально, но я не знаю, что делать для загрузки компонентов и не знаю, куда положить <router-view>.

Текущая страница такова:

enter image description here

Приложение. vue

<template>
  <v-app>
    <v-content v-if="isLoggedIn">
      <v-navigation-drawer v-if="isLoggedIn" permanent>
        <v-toolbar flat>
          <v-list>
            <v-list-tile>
              <v-list-tile-title class="title">Application</v-list-tile-title>
            </v-list-tile>
          </v-list>
        </v-toolbar>

        <v-divider></v-divider>

        <v-list dense nav>
          <v-list-item v-for="item in items" :key="item.title" link>
            <v-list-tile>
              <v-list-tile-action>
                <v-icon>{{item.icon}}</v-icon>
              </v-list-tile-action>

              <v-list-tile-content>
                <v-list-tile-title>{{item.title}}</v-list-tile-title>
              </v-list-tile-content>
            </v-list-tile>
          </v-list-item>
        </v-list>
      </v-navigation-drawer>
    </v-content>

    <login v-else />
  </v-app>
</template>

<script>
import login from "@/views/Login";

export default {
  name: "App",
  components: {
    login
  },
  data() {
    return {
      items: [
        { title: "Dashboard", icon: "dashboard" },
        { title: "Settings", icon: "settings" }
      ]
    };
  },
  computed: {
    isLoggedIn() {
      return this.$store.getters.user != null;
    }
  }
};
</script>

Маршрутизатор / индекс. js

import Login from '@/views/Login'
import Dashboard from '@/views/Dashboard'
import Settings from '@/views/Settings'

import VueRouter from 'vue-router'
import Vue from 'vue'

Vue.use(VueRouter)

const routes = [
    {
        path: '/',
        name: 'Login',
        component: Login
    },
    {
        path: '/Settings',
        name: 'Settings',
        component: Settings
    },
    {
        path: '/Dashboard',
        name: 'Dashboard',
        component: Dashboard
    }
]

export default new VueRouter({
    mode: 'history',
    routes
})

Настройки. vue

<template>
  <h1>Settings</h1>
</template>

<script>
export default {
  name: "Settings"
};
</script>

Панель инструментов. vue

<template>
  <h1>Dashboard</h1>
</template>

<script>
export default {
  name: "Dashboard"
};
</script>

<style>
</style>

1 Ответ

1 голос
/ 17 января 2020

Вы можете попробовать поместить router-view в приложение. vue

<template>
  <v-app>
    <v-navigation-drawer v-if="isLoggedIn">
      ...
    </v-navigation-drawer>
    <v-content>
      <router-view></router-view>
    </v-content>
  </v-app>
</template>

<script>
export default {
  mounted () {
    if (this.isLoggedIn) {
      // this is better to have guard in router
      // https://router.vuejs.org/guide/advanced/navigation-guards.html#global-before-guards
      this.$router.push('/login')
    }
  },
}
</script>

Примечание:

  • Вам не нужно импортировать вход в приложение. vue , Вы должны использовать router-view для его рендеринга.
  • Защита маршрутизатора лучше работает в другом месте, например router / index. js. Вы можете найти пример здесь
...