[ Vue cli ] 要怎麼透過 Vue 控制 bootstrap 的 JS 元件呢?

為什麼要透過 Vue 來控制 Bootstrap 的 JavaScript 元件呢?如果有寫過 Bootstrap,在透過 Bootstrap 開發網頁的過程中,不寫任何 JavaScript 的程式碼,相關的元件還是會有反應。




那麼為何要大費周章的給自己找麻煩呢?這是因為,有些時候我們需要針對元件做比較細緻的調整。像是 modal 這個元件,我們就很常需要等到遠端的資料取得之後,再印製到 modal 上,最後才呈現給客戶端。如果不做這層調整,很有可能 modal 會先跳出來,但是裡面卻沒有任何資料;如此造成使用者會誤以為這個網頁是不是失效了,進而使得網頁的使用者流失(幾乎就等於潛在收益的流失)。

那麼,實際上要怎麼操作呢?


在這之前,請先確保自己的 Vue Cli 專案中,已經透過 npm 安裝了 Bootstrap 和 jQuery/popper.js,這兩個套件。

# 在 main.js 中載入套件

在沒有 Vue Cli 或其他網頁打包工具的開發中,我們是透過手動將 css 、或是 js 這些網頁所需的設定檔載入 html 的檔案裡。在 Vue Cli 這樣的打包工具裡,我們則是透過打包工具提供的規則,將這些外部檔案載入 html 檔案中。

在 Vue Cli 中,是由 main.js 這支檔案負責。(我自己是把這支檔案想像成整個網頁檔背後的操盤手XD)

Vue Cli 會將所有的元件匯出成 html 格式的檔案,其他元件(包刮根元件 app.vue)負責網頁的顯示面,也就是 body 標籤裡面的所有東西;main.js 則是負責 head 標籤裡面的內容。

在 main.js 裡用這段程式碼把 jQuery(如果需要的話) 和 bootstrap 整個匯進來:

 import 'jquery';
 import 'bootstrap';

這樣我們就可以在 Vue 中使用 bootstrap 啦~!



這邊有幾個小細節(或許很多人都知道了,但是我還是紀錄一下):
  1. 在 node_module 裡面的套件不用打詳細的路徑,只要用名稱即可 
  2. 因為我們只是要把 bootstrap 的檔案載入 head 標籤裡,沒有要載入Vue.js 的實例中(也就是不會在 Vue.use, Vue.component 之類的方法把 bootstrap 抓近來),所以不用像其他套件要使用到名稱 
  3. 這段語法是把「整個」bootstrap 載入,包刮 css 檔和 js 檔

 若是只想要載入bootstrap 的 js 檔:
 import "bootstrap/dist/js/bootstrap.js" 

# 透過 Bootstrap 提供的 methods 做操作 Modal

把需要的套件載進專案裡面,我們就可以來處理 Bootstrap 的元件啦!從 Bootstrap 提供的使用說明中,可以看到官方有提供元件的 JavaScript 的方法,像是 $('#myModal').modal('show') 這樣的語法。這些語法讓身為開發者的我們可以用我們自己的程式碼控制 modal (其他元件也是依此類推)。比方說,我們不見得要用 button 叫出 modal,也可以透過這些 bootstrap 提供的方法,讓它每十秒跳出一次。(雖然不知道為什麼要做這種事情 )。

 Bootstrap 的 JavaScript 是怎麼運作的?
在我們寫 JavaScript 時,如果我們要綁定事件在某個 button 上面,並更改某個 div 的樣式,我們會先透過 JavaScript 把這個 button 存在程式碼裡面,像這樣:

const btn = document.querySelector('.btn');
const div = document.querySelector('.div');

然後,我們再透過把事件綁定到按鈕上,透過程式碼去操控 div 的樣式。Bootstrap 也是一樣的,但是它不是透過 class 和 id 去做網頁元素的選取,而是透過 data-toggle 和 data-target 去選取 DOM。所以,我們才不需要寫任何的程式碼,只要加入相對應的 data- 標籤就可以有 JavaScript 的功能。

也因此,若我們想要透過自己的程式碼操作 Bootstrap 的 JavaScript 元件或功能,我們就要把 data- 的標籤拿掉。在拿掉標籤之後,我們就可以在 Vue 的 HTML template 中,把事件綁定到按鈕上:

<template>
   <button click="event"></button>
</template>

<script>
{
   methods: {
       event(){
           $('#myModal').modal('show'); 
       }
   }
}
</script>


# 載入 $ 這個變數

這時候,程式碼可能會跳錯,顯示:它不認得 $ 是什麼 

$ 是 jquery 專用的變數。在我們把 Bootstrap 的 js 檔匯入專案時,其實並沒有把 jquery 匯進來。這時候我們可以用局部或是全域的方式把 jquery 匯進來,這部分就看專案的需求如何。例如,在我目前在寫的專案可能只是需要在某一兩個頁面使用到 jquery 的語法;而且我還沒有用到所有 jquery 的語法,我只會用到 $ 這個變數,所以我可能就會考慮只要把 $ 載入相關元件就好。 

局部:
import $ from 'jquery';

全域(在 main.js):
import 'jquery';


*

**關於在Vue cli 中使用 jquery 這篇文章有更詳細的說明:

https://pjchender.github.io/2017/09/26/vue-在-vue-中使用(es6-import)-bootstrap4-和-jquery/

0 意見