88
85

More than 3 years have passed since last update.

Vue でダッシュボードの雛形を作る最速の道

Last updated at Posted at 2019-02-07

今回の最速はたぶん煽りではありません。
ただ、最速だけだと記事も最短になってしまうので、Vue CLI 3 を使ってマニュアルで仕立てる手も紹介します。

この記事は MacOS 10.14.2 で検証してあります。

準備1

Node.js と npm を用意します。

最速の道

雛形のダウンロード

Creative Tim のホームページから Vuetify Material Dashboard をダウンロードします。
(無料ですが登録が必要です。)

実行

ダウンロードした zip を解凍したフォルダに入って

$ npm i
$ npm run dev

として、ブラウザで

localhost:8080

にアクセスすれば以下の画面が表示されます。

スクリーンショット 2019-02-08 2.16.02.png

カスタマイズ

あとは上記フォルダの中の src フォルダ以下を弄っていけばいいです!

マニュアルで仕立てる道

準備2

Vue CLI 3 のインストール

もし vue-cli の昔のバージョンを使っていたら、アンインストールします。

$ npm uninstall -g vue-cli

Vue CLI 3 をグローバルにインストールします。

$ npm i -g @vue/cli

プロジェクトの作成

例として、experimental という名前でプロジェクトを作成します。選択肢がでてきます。

$ vue create experimental

Vue CLI v3.4.0
? Please pick a preset: 
  default (babel, eslint) 
❯ Manually select features 

Manually select features を選択します。

Vue CLI v3.4.0
? Please pick a preset: Manually select features
? Check the features needed for your project: 
 ◯ Babel
 ◯ TypeScript
 ◯ Progressive Web App (PWA) Support
❯◉ Router
 ◉ Vuex
 ◯ CSS Pre-processors
 ◯ Linter / Formatter
 ◯ Unit Testing
 ◯ E2E Testing

あとで間違いなく必要になるので、Router と Vuex を選択します。他のは説明の都合上はずします。必要だったら後から入れられます。

Vue CLI v3.4.0
? Please pick a preset: Manually select features
? Check the features needed for your project: Router, Vuex
? Use history mode for router? (Requires proper server setup for index fallback in
 production) (Y/n) 

いろいろ聞いてきますが、デフォルトで進めます。

プロジェクト名(ここでは experimental)のフォルダが作成されます。また自動的に .git も作られて git で管理できるようになります。

次の作業のために、できたフォルダに入ります。

$ cd experimental

プロジェクトに Vuetify を入れる。

コンポーネントライブラリを使えば開発をとても早く進められます。今回は Vuetify を入れます。

Vuetify を入れるには、コマンドラインでやる方法と GUI でやる方法があります。

コマンドラインでやる方法

$ vue add vuetify

とやるだけです。簡単ですね!

GUI を使う方法

Vue CLI 3 からブラウザを GUI に使ってプロジェクトを管理できるようになりました。使わない手はありません。

$ vue ui

とやると、ブラウザが開いてプロジェクト一覧が表示されます。

スクリーンショット 2019-02-08 2.47.36.png

Import タブを選んで、Import this folder ボタンを押します。

スクリーンショット 2019-02-08 2.49.56.png

プロジェクトのダッシュボードが表示されます。

スクリーンショット 2019-02-08 2.53.37.png

左側の上から2つめのプラグインボタンを押すと現在インストールされてるプラグインが表示されます。

スクリーンショット 2019-02-08 3.53.18.png

右上の Add Plugin ボタンを押して、サーチフィールドに vuetify と入力します。

スクリーンショット 2019-02-08 2.58.17.png

一番上の vue-cli-plugin-vuetify を選択して右下の install ボタンを押します。

スクリーンショット 2019-02-08 2.59.59.png

Finish Installation を押せばなんと Git の差分の画面になります。コミットするなりスキップするなりしましょう

スクリーンショット 2019-02-08 3.06.35.png

無事 Vuetify がインストールできました。
スクリーンショット 2019-02-08 3.55.21.png

一旦実行

$ npm run serve

とすると、サービスが始まります。
ブラウザで localhost:8080 にアクセスすると、以下の画面になり、Vuetify がインストールできたことが確認できます。

スクリーンショット 2019-02-08 3.11.29.png

ダッシュボード化

ここからが本題です。

スクリーンショット 2019-02-08 5.29.08.png

いろいろなデザインが考えられますが、今回はとりあえずこんな風にしてみます。

App.vue

  • 左側にドロワーを配置して、「ダッシュボード」「設定」「について」メニューをつけます。
  • 右側にドロワーを配置して、「ログアウト」ボタンをつけます。
  • 上にツールボックスを配置してドロワーの出し入れをできるようにします。

<template>
    <v-app>
        <v-navigation-drawer app clipped fixed v-model="leftDrawer" :mini-variant="leftMiniVariant">
            <v-list>
                <v-list-tile to='/'>
                    <v-list-tile-action><v-icon>dashboard</v-icon></v-list-tile-action>
                    <v-list-tile-content><v-list-tile-title>ダッシュボード</v-list-tile-title></v-list-tile-content>
                </v-list-tile>

                <v-list-tile to='/prefs'>
                    <v-list-tile-action><v-icon>settings</v-icon></v-list-tile-action>
                    <v-list-tile-content><v-list-tile-title>設定</v-list-tile-title></v-list-tile-content>
                </v-list-tile>

                <v-list-tile to='/about'>
                    <v-list-tile-action><v-icon>store</v-icon></v-list-tile-action>
                    <v-list-tile-content><v-list-tile-title>について</v-list-tile-title></v-list-tile-content>
                </v-list-tile>
            </v-list>
        </v-navigation-drawer>

        <v-toolbar app clipped-left clipped-right>
            <v-toolbar-side-icon @click.stop="leftDrawer = !leftDrawer"></v-toolbar-side-icon>
            <v-btn icon @click.stop="leftMiniVariant = !leftMiniVariant">
                <v-icon v-html="leftMiniVariant ? 'chevron_right' : 'chevron_left'"></v-icon>
            </v-btn>
            <v-toolbar-title>The Dashboard</v-toolbar-title>
            <v-spacer></v-spacer>
            <v-toolbar-title>{{ $store.state.user ? $store.state.user : '未ログイン' }}</v-toolbar-title>
            <v-btn icon @click.stop="rightDrawer = !rightDrawer">
                <v-icon>account_circle</v-icon>
            </v-btn>
        </v-toolbar>

        <v-content><router-view/></v-content>

        <v-navigation-drawer app clipped fixed v-model="rightDrawer" right>
            <v-list>
                <v-list-tile to="/login">
                    <v-list-tile-action><v-icon>dashboard</v-icon></v-list-tile-action>
                    <v-list-tile-content><v-list-tile-title>ログアウト</v-list-tile-title></v-list-tile-content>
                </v-list-tile>
            </v-list>
        </v-navigation-drawer>

        <v-footer fixed app><span>&copy; 2018</span></v-footer>

    </v-app>
</template>

<script>
export default {
    name: 'App'
,   data () {
        return {
            leftMiniVariant : false
        ,   leftDrawer      : false
        ,   rightDrawer     : false
        }
    }
}
</script>

コンポーネントたち

とりあえずダミーをおいておきます。

views/Dashboard.vue
<template>
    <h1>Dashboard</h1>
</template>
views/About.vue
<template>
    <h1>About</h1>
</template>
views/Prefs.vue
<template>
    <h1>Prefs</h1>
</template>
views/Login.vue
<template>
    <h1>Login/Logout</h1>
</template>

Vuex(ストア)

インプリ時にきっと必要になるログイン情報をとりあえず置いておきます。

store.js
import Vue from 'vue'
import Vuex from 'vuex'

Vue.use(Vuex)

export default new Vuex.Store(
    {   state       : { user    : '' }
    ,   mutations   : { user    : ( state, payload ) => state.user = payload }
    }
)

vue-router

router.js
import Vue from 'vue'
import Router from 'vue-router'
import Dashboard from './views/Dashboard.vue'

Vue.use(Router)

export default new Router(
    {
        mode: 'history'
    ,   base: process.env.BASE_URL
    ,   routes: [
            {   path: '/'       , component: Dashboard }
        ,   {   path: '/about'  , component: () => import( /* webpackChunkName: "about" */ './views/About.vue' ) }
        ,   {   path: '/prefs'  , component: () => import( /* webpackChunkName: "prefs" */ './views/Prefs.vue' ) }
        ,   {   path: '/login'  , component: () => import( /* webpackChunkName: "login" */ './views/Login.vue' ) }
        ]
    }
)

メイン

CLIが作ったままで変更ありません。

main.js
import Vue from 'vue'
import './plugins/vuetify'
import App from './App.vue'
import router from './router'
import store from './store'

Vue.config.productionTip = false

new Vue({
  router,
  store,
  render: function (h) { return h(App) }
}).$mount('#app')

最後に

Vuetify ベースのテーマ がとても充実してきました。もう自分でスクラッチから作る時代ではないかもしれません。

88
85
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
88
85