App.vue

  • 母版页其实也就是对App.vue这个文件进行修改,用户可以在App.vue中以<router-view></router-view>的方式来切换视图
  • 将App.vue修改成如下形式
<template>
  <!--v-app,有且只有一个-->
  <v-app id="app">
    <!--导航侧栏,clipped属性用于将侧栏置于应用栏下方,drawer用于侧栏的显示和隐藏-->
    <v-navigation-drawer app clipped v-model="drawer">
      <!--左上方的头像、用户名和邮箱的显示-->
      <v-list>
        <v-list-item two-line>
          <!--头像-->
          <v-list-item-avatar>
            <v-img src="./assets/logo.png" alt="头像"></v-img>
          </v-list-item-avatar>
          <!--简介-->
          <v-list-item-content>
            <!--用户名-->
            <v-list-item-title>游客</v-list-item-title>
            <!--邮箱-->
            <v-list-item-subtitle>example@mail.com</v-list-item-subtitle>
          </v-list-item-content>
        </v-list-item>
      </v-list>
      <!--一条分割线-->
      <v-divider></v-divider>
      <!--导航列表-->
      <v-list nav dense>
        <!--主页-->
        <v-list-item link>
          <!--mdi图标,home-->
          <v-list-item-icon>
            <v-icon>mdi-home</v-icon>
          </v-list-item-icon>
          <!--文字说明-->
          <v-list-item-title>主页</v-list-item-title>
        </v-list-item>
      </v-list>
      <!--导航侧栏底部插槽-->
      <template v-slot:append>
        <!--登录按钮-->
        <div class="pa-2">
          <v-btn block color="primary">登录</v-btn>
        </div>
        <!--注册按钮-->
        <div class="pa-2">
          <v-btn block color="success">注册</v-btn>
        </div>
        <!--注销按钮,登录成功后才可见-->
        <div class="pa-2">
          <v-btn block color="error">注销</v-btn>
        </div>
      </template>
    </v-navigation-drawer>

    <!--顶部导航栏,clipped-left用于控制导航侧栏在左边-->
    <v-app-bar app clipped-left dense color="blue">
      <!--顶部导航栏左侧的一个小按钮,点击之后会显示或隐藏导航侧栏-->
      <v-app-bar-nav-icon @click.stop="drawer = !drawer" color="white"></v-app-bar-nav-icon>
    </v-app-bar>

    <!--页面主要内容部分,基本上以视图替换的形式体现-->
    <v-main>
      <!--结合v-router,修改index.js文件,可以进行视图的替换-->
      <router-view></router-view>
    </v-main>

    <!--最下方的底部导航栏-->
    <v-bottom-navigation app color="primary">
      <!--gitee源码地址,target属性指定在新标签页打开-->
      <v-btn href="https://gitee.com/kimu" target="_blank">
        <v-icon>mdi-share-variant></v-icon>
      </v-btn>
    </v-bottom-navigation>
  </v-app>
</template>

<script>

export default {
  name: 'App',

  data: () => ({
    // 控制导航侧栏的显示和隐藏
    drawer: true
  })
}
</script>
  • 到这一步为止我们不需要修改其它的任何文件,也不需要添加图片等静态文件
  • 你可能需要在vscode中安装vue相关插件,否则代码写上去就是纯白色,很难辨别
  • 有关vuevuetify的语法请自行上网搜索
  • 使用命令npm run serve或者直接在vue ui中运行(推荐),运行后页面效果如下
  • 上方的导航栏、左边的导航侧栏,以及下方的底部导航栏是整个项目通用的部分,而中间的页面是通过<router-view></router-view>来进行管理控制的,查看router/index.js中的代码就可以知道,页面打开是默认将 / 映射到Home.vue这个视图上
  • 接下来我们需要对模板页做一个小小的改进,毕竟有些地方显示还是不太合理

Vuex

  • 是用来做全局状态管理的,其实就是跨页面通用的一些信息,一般是用户相关信息
  • 对应着store/index.js文件,将该文件修改成如下形式
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store({
  state: {
    // 代表用户自身,最终不一定会以这种方式呈现
    user: {
      id: null,
      username: '',
      password: '',
      enabled: true,
      firstName: '',
      lastName: '',
      gender: 0,
      phone: '',
      email: '',
      icon: '',
      birthday: new Date().toISOString().substr(0, 10),
      joinedDate: new Date().toISOString().substr(0, 10),
      // 和用户相关的一些链接,比如用户自身的描述
      _links: []
    }
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})
  • 再对App.vue进行修改成如下形式
<template>
  <!--v-app,有且只有一个-->
  <v-app id="app">
    <!--导航侧栏,clipped属性用于将侧栏置于应用栏下方,drawer用于侧栏的显示和隐藏-->
    <v-navigation-drawer app clipped v-model="drawer">
      <!--左上方的头像、用户名和邮箱的显示-->
      <v-list>
        <v-list-item two-line>
          <!--头像-->
          <v-list-item-avatar>
            <v-img v-if="$store.state.user.icon" :src="$store.state.user.icon" alt="头像"></v-img>
            <v-img v-else src="./assets/logo.png" alt="头像"></v-img>
          </v-list-item-avatar>
          <!--简介-->
          <v-list-item-content>
            <!--用户名-->
            <v-list-item-title>游客</v-list-item-title>
            <!--邮箱-->
            <v-list-item-subtitle>example@mail.com</v-list-item-subtitle>
          </v-list-item-content>
        </v-list-item>
      </v-list>
      <!--一条分割线-->
      <v-divider></v-divider>
      <!--导航列表-->
      <v-list nav dense>
        <!--主页-->
        <v-list-item link>
          <!--mdi图标,home-->
          <v-list-item-icon>
            <v-icon>mdi-home</v-icon>
          </v-list-item-icon>
          <!--文字说明-->
          <v-list-item-title>主页</v-list-item-title>
        </v-list-item>
      </v-list>
      <!--导航侧栏底部插槽-->
      <template v-slot:append>
        <!--登录按钮-->
        <div v-if="$store.state.user.username === ''" class="pa-2">
          <v-btn block color="primary">登录</v-btn>
        </div>
        <!--注册按钮-->
        <div v-if="$store.state.user.username === ''" class="pa-2">
          <v-btn block color="success">注册</v-btn>
        </div>
        <!--注销按钮,登录成功后才可见-->
        <div v-if="$store.state.user.username !== ''" class="pa-2">
          <v-btn block color="error">注销</v-btn>
        </div>
      </template>
    </v-navigation-drawer>

    <!--顶部导航栏,clipped-left用于控制导航侧栏在左边-->
    <v-app-bar app clipped-left dense color="blue">
      <!--顶部导航栏左侧的一个小按钮,点击之后会显示或隐藏导航侧栏-->
      <v-app-bar-nav-icon @click.stop="drawer = !drawer" color="white"></v-app-bar-nav-icon>
    </v-app-bar>

    <!--页面主要内容部分,基本上以视图替换的形式体现-->
    <v-main>
      <!--结合v-router,修改index.js文件,可以进行视图的替换-->
      <router-view></router-view>
    </v-main>

    <!--最下方的底部导航栏-->
    <v-bottom-navigation app color="primary">
      <!--gitee源码地址,target属性指定在新标签页打开-->
      <v-btn href="https://gitee.com/kimu" target="_blank">
        <v-icon>mdi-share-variant</v-icon>
      </v-btn>
    </v-bottom-navigation>
  </v-app>
</template>

<script>

export default {
  name: 'App',

  data: () => ({
    // 控制导航侧栏的显示和隐藏
    drawer: true
  })
}
</script>
  • 可以看出修改后和修改前的区别在于对于用户登录状态的鉴定,通过vuex的state我们可以判断一个用户是否处于登录状态,并且这个state并不会因为view的切换而消失(但是刷新页面会重置)
  • 现在的页面效果如下
  • 可以看出左侧导航栏中注销这个按钮不见了,确实对应了用户没有登录的状态

至此,用vuetify写一个简单的模板页已讲解完毕,下一节会讲解如何用vue-axios向后端发送请求以及如何用vuex来进一步管理全局状态