從0到1使用VUE-CLI3開發實戰(五):模塊化VUEX及使用vuetify

2021-02-20 技術放肆聊

小肆前幾天發了一篇2019年Vue精品開源項目庫的匯總,今天小肆要使用的是在UI組件中排行第三的Vuetify。

vuetify介紹

Vuetify是一個漸進式的框架,完全根據Material Design規範開發,一共擁有80多個組件,對移動端支持非常好。

支持SSR(服務端渲染),SPA(單頁應用程式),PWA(漸進式Web應用程式)和標準HTML頁面。

vuetify官方文檔給出了它具備的幾點優勢:

安裝

安裝算是比較簡單了,在項目目錄輸入以下命令就OK:

vue add vuetify

但這時有一個問題,如果我們使用默認的icon,index.html裡面引入的是google的連結

  <link href='https://fonts.googleapis.com/css?family=Roboto:100,300,400,500,700,900|Material+Icons' rel="stylesheet">

我們需要替換成國內的

https:

底部導航組件

今天我們先用vuetify的語法寫一個底部導航的組件,先放代碼:

<template>
  <v-card flat>
    <v-bottom-nav :value="true" fixed color="transparent">
      <v-btn color="teal" :to="{path:'/'}" flat>
        <span>首頁</span>
        <v-icon>home</v-icon>
      </v-btn>

      <v-btn color="teal" :to="{path:'/lottery'}" flat>
        <span>足彩</span>
        <v-icon>favorite</v-icon>
      </v-btn>

      <v-btn color="teal" :to="{path:'/competition'}" flat>
        <span>賽事</span>
        <v-icon>place</v-icon>
      </v-btn>

      <v-btn color="teal" :to="{path:'/course'}" flat>
        <span>課程</span>
        <v-icon>music_video</v-icon>
      </v-btn>
    </v-bottom-nav>
  </v-card>
</template>

這裡主要用到的是v-bottom-nav這個API,下面這張圖顯示了它可用的全部屬性:

上述代碼的實際顯示效果:

模塊化vuex

為了使用方便,我們改造一下vuex,新建store目錄,目錄結構如下:

更改store.js

import Vue from 'vue'
import Vuex from 'vuex'
import app from './store/modules/app'
import user from './store/modules/user'
import getters from './store/getters'

Vue.use(Vuex)

const store = new Vuex.Store({
  modules: {
    app,
    user
  },
  getters
})

export default store

全局loading

昨天我們配置了axios,今天我們來配置一下全局loading。

先寫一個組件`RequestLoading.vue`

<template>
  <transition name="fade-transform" mode="out-in">
    <div class="request-loading-component" v-if="requestLoading">
      <v-progress-circular :size="50" color="primary" indeterminate></v-progress-circular>
    </div>
  </transition>
</template>

<script>
import { mapGetters } from 'vuex'

export default {
  name: 'RequestLoading',
  computed: {
    ...mapGetters(['requestLoading'])
  }
}
</script>

<style lang="stylus" scoped>
.request-loading-component {
  position: fixed;
  left: 0;
  right: 0;
  top: 0;
  bottom: 0;
  background-color: rgba(48, 65, 86, 0.5);
  font-size: 150px;
  display: flex;
  flex-direction: row;
  justify-content: center;
  align-items: center;
  z-index: 999999;
}
</style>

這裡我們用到了,vuetify中的v-progress-circular

接下來我們配置一下vuex

app.js

const app = {
  state: {
    requestLoading: 0
  },
  mutations: {
    SET_LOADING: (state, status) => {
      
      if (status === 0) {
        state.requestLoading = 0
        return
      }
      if (status) {
        ++state.requestLoading
      } else {
        --state.requestLoading
      }
    }
  },
  actions: {
    SetLoading({ commit }, status) {
      commit('SET_LOADING', status)
    }
  }
}

export default app

getter.js

const getters = {
  requestLoading: (state) => state.app.requestLoading,
  token: (state) => state.user.token,
  avatar: (state) => state.user.avatar,
  name: (state) => state.user.name
}

export default getters

最後我們修改一下axios.js


service.interceptors.request.use(
  (config) => {
    if (config.method === 'post' || config.method === 'put') {
      
      config.data = JSON.stringify(config.data)
    }
    
    store.dispatch('SetLoading', true)
    
    return config
  },
  (error) => {
    
    
    setTimeout(function() {
      store.dispatch('SetLoading', 0)
    }, 300)

    return Promise.reject(error)
  }
)


service.interceptors.response.use(
  (response) => {
    let { data, headers } = response

    if (headers['x-auth-token']) {
      data.token = headers['x-auth-token']
    }
    
    store.dispatch('SetLoading', false)
    return data
  },
  (error) => {
    let info = {},
      { status, statusText, data } = error.response

    if (!error.response) {
      info = {
        code: 5000,
        msg: 'Network Error'
      }
    } else {
      
      info = {
        code: status,
        data: data,
        msg: statusText
      }
    }
    
    store.dispatch('SetLoading', false)
    return Promise.reject(info)
  }
)

這樣我們在等待接口返回數據是就會看到下面這樣子:

小結

好啦 ,今天就到這裡吧,如果有什麼疑問,可以下面留言,小肆會及時回復的。記得點好看呦!

前置閱讀:

用vue-cli3從0到1做一個完整功能手機站(一)

從0到1開發實戰手機站(二):Git提交規範配置

從0到1使用VUE-CLI3開發實戰(三): ES6知識儲備

從0到1使用VUE-CLI3開發實戰(四):Axios封裝

相關焦點

  • 手把手教你使用Electron5+vue-cli3開發跨平臺桌面應用
    雖然B/S是目前開發的主流,但是C/S仍然有很大的市場需求。受限於瀏覽器的沙盒限制,網頁應用無法滿足某些場景下的使用需求,而桌面應用可以讀寫本地文件、調用更多系統資源,再加上Web開發的低成本、高效率的優勢,這種方式越來越受到開發者的喜愛。本文一步一步教你如何使用Electron5和vue-cli3,在完全保留vue開發web應用的習慣下,搭建桌面應用。
  • 一份超級詳細的Vue-cli3.0使用教程
    編者按:本文轉載自 OBKoro1 的個人公眾號:OBKoro1的學習分享前言在vue-cli 2.X的時候,也寫過一篇類似的文章,在八月份的時候
  • 2019年掌握前端Vue,年薪直奔30萬!
    前端開發者對Vue使用頻率也越來越高。作為由華人程式設計師尤雨溪開發的前端構架,它的出身就給國人帶來了巨大的榮耀。更為重要的是Vue相對於其他前端框架更加易於上手,而且還可以與第三方庫或者既有項目整合,同時還可以為單頁應用提供驅動。目前行業的黑話:不會Vue的前端不是合格的前端工程師!
  • Electron: 如何以 Vue.js, Vuetify 開始應用
    同時可安裝如下些擴展:查看 VS Code 版本:$ code -v1.46.1cd9ea6488829f560dc949a8b2fb789f3cdc05f5dx64Node.jsNode.js 開發環境,下載地址:https://nodejs.org/en/download/ 。
  • vuetify,一直使用一直爽
    整理:迷妹大家好,我是為前端娛樂圈操碎了心的小迷妹,每天推薦一個小工具/源碼/知識點,裝滿你的收藏夾,每天分享一個小技巧,讓你輕鬆節省開發效率
  • 用vue-cli3從0到1做一個完整功能手機站(一)
    開篇從今天起,小肆將和大家從頭開始做一個完整的實戰項目。
  • 淺析Vuex及相關面試題答案
    自從學習了Vue框架,其中必不可少的會用到vuex這個核心插件,而且在做項目的時候,基本都會使用,可能你會使用vuex狀態管理,但是對vuex原理存在著或多或少的的疑惑或不解
  • 【收藏】2019年最新Vue相關精品開源項目庫匯總
    element ★34436 - 餓了麼出品的Vue2的web UI工具套件iview ★19488 - 基於 Vuejs 的開源 UI 組件庫vuetify ★16076 - 為移動而生的Vue JS 2組件框架Vux ★14975 - 基於Vue和WeUI的組件庫mint-ui ★13302 - Vue 2的移動UI元素
  • 如何使用Vue + Electron搭建跨平臺應用
    Vue CLIVue CLI 是 Vue.js 開發的標準工具。GitHub: https://github.com/vuetifyjs/vuetify添加 Vuetify :cd my-appvue add vuetify
  • vue插件看這一篇就夠
    ios7-vue - 使用vue2.0 vue-router vuex模擬ios7Framework7-VueJS - 使用移動框架的示例cnode-vue - 基於vue和vue-router構建的cnodejs web網站SPAvue-cli-multipage-bootstrap - 將vue官方在線示例整合到組件中vue-cnode
  • vue系列教程之微商城項目|vuex全局狀態管理-加入購物車
    vuex簡介vuex是vue項目中用於管理全局狀態的插件,如果對狀態二字不明了,就簡單理解成全局變量即可.vuex創建和引用自動創建和引用在用腳手架vue-cli創建項目時(vue create xxx),如果已經選擇了vuex,那麼在項目src目錄下會自動創建store文件夾,並自動引入項目中。
  • Vue 開源項目庫匯總
    ★1166 - Vue.js選擇框解決方案vue-table ★824 - 簡化數據表格VueCircleMenu ★776 - 漂亮的vue圓環菜單vue-chat ★748 - vuejs和vuex及webpack的聊天示例radon-ui ★633 - 快速開發產品的Vue組件庫vue-waterfall ★605 - Vue.js
  • 7個實用的 Vue.js 工具和庫
    ,每天推薦一個小工具/源碼,裝滿你的收藏夾,每天分享一個小技巧,讓你輕鬆節省開發效率,實現不加班不熬夜不掉頭髮,是我的目標。它也是模塊化的,所以你只需使用程序所需的那些模塊即可。Nuxt 使你不必糾結於構建和優化程序的工作。Nuxt.js 具有模塊化架構,有50多個模塊可供選擇。
  • 手把手教你開發vue組件庫
    .在筆者寫完 從0到1教你搭建前端團隊的組件系統 之後很多朋友希望了解一下如何搭建基於vue的組件系統,所以作為這篇文章的補充,本文來總結一下如何搭建基於vue的組件庫.雖然筆者有近2年沒有從事vue的開發了,但平時一直在關注vue的更新和發展, 筆者一直認為技術團隊的組件化之路重點在於基礎架構的搭建以及組件化的設計思想,我們完全可以採用不同的框架實現類似的設計,所以透過現象看本質,思想才是最重要的.本文主要教大家通過使用vue-cli3 一步步搭建一個組件庫並發布到npm上,但筆者認為重點不在於實現搭建組件庫的具體方式,而在於設計組件庫的思想和取捨.
  • vue最簡單的入門教程+實戰(vue-cli3.X)
    如果你有使用過node,並安裝過npm,可以跳過這一步。詳情參考:nodejs安裝好nodejs之後,在終端下面輸入命令node -v會有版本號出來。就說明安裝成功了。輸入npm -v也會有版本號出來,就說明,npm也已經安裝好了。Vue CLI 需要 Node.js 8.9 或更高版本 (推薦 8.11.0+)。
  • 使用Typescript封裝Vue組件
    一、搭建項目以及初始化配置這裡使用了vue CLI3自定義選擇的服務,我選擇了ts、stylus
  • vuex原理你知多少?
    vuex作為vue官方出品的狀態管理框架,以及其簡單API設計、便捷的開發工具支持,在中大型的vue項目中得到很好的應用。作為flux架構的後起之秀,吸收了前輩redux的各種優點,完美的結合了vue的響應式數據vuex作為vue生態的重要組成部分,是對store進行管理的一柄利劍。簡而言之,vuex是vue的狀態管理器。
  • vue.js-使用vue-cli3快速創建項目
    一、環境搭建安裝node下載地址:https://nodejs.org2.安裝vue-cli(1)運行如下命令安裝:default (babel,eslint) 默認,提供babel和eslint支持Manually select features 自己選擇需要的功能,使用上下方向鍵來切換,按下enter為選中1、TypeScript -- 支持使用 TypeScript 書寫源碼。
  • Vue開發之vue-router的基本使用
    在這個文件裡,我們需要做的是,將組件 (components) 映射到路由 (routes)。// 0.如果使用模塊化機制編程,導入Vue和VueRouter,要調用 Vue.use(VueRouter)import Vue from 'vue' // 導入vueimport VueRouter from 'vue-router' // 導入vue-routerVue.use(VueRouter)// 1.
  • Vue 2.0 構建單頁應用最佳實戰
    ,vuex1.使用vue-cli創建項目2.使用vue-router實現單頁路由3.用vuex管理我們的數據流4.使用vue-resource請求我們的node服務端5.使用.vue文件進行組件化的開發PS:本文node v6.2.2 npm v3.9.5 vue v2.1.0 vue-router v2.0.3 vuex