BootstrapVue:Vue CLI 3 で Bootstrap 4 を使う

Vue CLI 3 で作った環境に、Bootstrap 4 を入れて使ってみたい。静的なスタイル適用だけであれば、Bootstrap 4 自体を導入して SCSS を読み込めば良いだろうが、jQuery に依存している動的な一部機能が使えない。

Angular だと ngx-bootstrap などの Bootstrap ラッパーがあるのだが、Vue の場合は BootstrapVue というラッパーツールがあり、コレを使うのが良さそうだ。

今回は Vue CLI (@vue/cli) でプロジェクトの雛形を作り、そこに BootstrapVue をプラグインとして導入してみようと思う。

目次

Vue プロジェクトの雛形を作成する

まずは @vue/cli でプロジェクトの雛形を作ろう。

# Vue CLI のインストール
$ npm install -g @vue/cli

# Vue プロジェクトを作る
$ vue create my-bootstrap-vue

特に凝った構成にはしておらず、TypeScript を有効にしたくらい。

BootstrapVue をインストールする

BootstrapVue の導入方法は色々あるが、Vue CLI で作ったプロジェクトだと、$ vue add というプラグイン追加のコマンドを使うのが楽そうだった。

# 以下で BootstrapVue を入れる
$ vue add bootstrap-vue

�📦  Installing vue-cli-plugin-bootstrap-vue...

+ vue-cli-plugin-bootstrap-vue@0.4.0
added 1 package from 1 contributor and audited 34402 packages in 7.856s
found 0 vulnerabilities

✔  Successfully installed plugin: vue-cli-plugin-bootstrap-vue

? Use babel/polyfill?  Yes  # ココだけ「Yes」と答える

�🚀  Invoking generator for vue-cli-plugin-bootstrap-vue...
�📦  Installing additional dependencies...

> bootstrap-vue@2.0.1 postinstall C:\Neos21\Dev\Sandboxes\my-bootstrap-vue\node_modules\bootstrap-vue
> opencollective || exit 0

                       ;XXXXXXXXXXXX333333333XXXXXXXXXXXXX; 
                        :2XXXXXXXXXXSisssssiSXXXXXXXXXXX2:  
                       .;S3XXXXXXXXX, .,,,,..,SXXXXXXXX3S;, 
                      .:SX2222XXXXXX, :XXXXS. r3XXXX2222X2;.
                      .riiiiii5XXXXX, .;;;;, :2XXXX5iiiiiir.
                        ;iiiiiiSXXXX, ,rrrr;,.;XXXSiiiiii;  
                         ;iiiiiiS2XX, ;3333X; .2XSiiiiii;   
                          :siiiiii2X, .::::,..r2iiiiiis:    
                           ,siiiiii2isrrrrrsi22iiiiiis,     
                            ,riiiiii23333333X2iiiiiir,      
                             .riiiiii5XXXXXX5iiiiiir.       
                              .;iiiiiiSXXXXSiiiiii;.        
                                ;iiiiiiSXXSiiiiii;
                                 :siiiiiiiiiiiis:
                                  ,siiiiiiiiiis,
                                   ,riiiiiiiir,
                                    .riiiiiir.
                                     .;iiii;.
                                       ;ii;
                                        ;;

                       Thanks for installing bootstrap-vue
                 Please consider donating to our open collective
                        to help us maintain this package.

                           Number of contributors: 230
                              Number of backers: 41
                             Annual budget: US$ 1,066
                            Current balance: US$ 1,525

          Donate: https://opencollective.com/bootstrap-vue/donate

added 10 packages from 16 contributors and audited 34424 packages in 8.938s
found 0 vulnerabilities

⚓  Running completion hooks...

✔  Successfully invoked generator for plugin: vue-cli-plugin-bootstrap-vue
   The following files have been updated / added:

     src/plugins/bootstrap-vue.js
     babel.config.js
     package.json
     src/main.ts

   You should review these changes with git diff and commit them.

こんな感じでインストールできた。

最後に出てきた4ファイルが追加・更新されたモノ。Bootstrap 本体の SCSS や BootstrapVue が追加されている。

Bootstrap が使えるか確認する

適当な .vue ファイルを開き、HTML に以下のように書いてみる。

<b-alert show>Default Alert</b-alert>

そしたら $ npm run serve で開発サーバを起動し、ページを開いてみる。

Bootstrap の Alert コンポーネント (色の付いた枠の要素) が表示されていれば、うまく BootstrapVue が適用できている。

BootstrapVue コンポーネントからのリンクはどう書く?

NavBar コンポーネントなど、Bootstrap コンポーネントからリンクを貼るタイプのモノの実装方法が、リファレンスからだとよく分からなかったので、調べてみた。

例えば <b-nav-item> などは、NavBar の1項目を表すコンポーネントなので、コレ自体にリンクを貼りたい。どうしたらいいかというと、Vue Router の <router-link> 要素と同じく to 属性で書ける。

<!-- NavBar 全体。色付け・下マージンなど -->
<b-navbar toggleable="lg" type="dark" variant="primary" class="mb-3">
  <b-navbar-brand href="#">タイトル</b-navbar-brand>
  
  <!-- 幅が狭い時に表示されるハンバーガーメニューアイコン・target 属性で開閉したい要素の id を指定する -->
  <b-navbar-toggle target="nav-collapse"></b-navbar-toggle>
  
  <!-- b-collapse に is-nav を付けておくと親要素のブレイクポイントで閉じられるようになる -->
  <b-collapse is-nav id="nav-collapse">
    <b-navbar-nav>
      <b-nav-item to="/"      exact-active-class="active">Home</b-nav-item>
      <b-nav-item to="/about" exact-active-class="active">About</b-nav-item>  <!-- exact と active-class を別々に付与することもできる -->
    </b-navbar-nav>
  </b-collapse>
</b-navbar>

<b-nav-item to="/"> と実装したとおり。<router-link to="/"> と書いたのと同じだ。

開いているページのリンクを明るくするには active という CSS クラスを指定したいが、exact-active-class 属性を使うと、パスが完全一致した時に付与する CSS クラス名を指定できる。

<b-nav-item to="/about" exact active-class="active">About</b-nav-item>

こんな風に exact 属性と active-class 属性とを併用しても良い。

以上

その他、BootstrapVue のコンポーネントは公式サイトのリファレンスを参照して欲しい。

Angular における ngx-bootstrap と似たようなノリで使えて良い感じ。

Vue の練習は以下のリポジトリでやっているので、よかったらドウゾ。

Zeit Now にデプロイしてみたので、以下のいずれかの URL で動作しているモノを見られる。