學習如何使用 Vue 創建單一檔案來封裝一個組件的所有相關內容,集中管理外觀和行為。

一個 Vue 組件可以在一個 JavaScript 檔案(.js)中這樣聲明:

Vue.component('component-name', {
   /* 選項 */
})

或者:

new Vue({
   /* 選項 */
})

也可以在一個 .vue 檔案中指定。

這個 .vue 檔案非常酷,因為它允許你在一個檔案中定義以下內容:

  • JavaScript 邏輯
  • HTML 代碼模板
  • CSS 樣式

所有這些內容都包含在一個檔案中,因此它得名為單檔元件

以下是一個例子:

<template>
   <p>{{ hello }}</p>
</template>

<script>
export default {
   data() {
      return {
         hello: 'Hello World!'
      }
   }
}
</script>

<style scoped>
   p {
      color: blue;
   }
</style>

所有這些都是可能的,感謝 webpack 的使用。Vue CLI 讓這一切變得非常容易並且支援開箱即用。在沒有 webpack 設置的情況下,無法使用 .vue 檔案,因此它們不適合於僅在頁面上使用 Vue 而不是作為完整單頁應用程式(SPA)的應用程式。

由於單檔元件依賴於 Webpack,我們免費獲得了使用現代 Web 功能的能力。

你可以使用 SCSS 或 Stylus 定義 CSS,使用 Pug 構建模板,只需告訴 Vue 你要使用哪種語言預處理器即可實現這一點。

支援的預處理器列表包括:

我們可以使用現代 JavaScript(ES6-7-8)來編寫,不受目標瀏覽器的限制,使用 Babel 整合和 ES 模塊,所以可以使用 import/export 聲明。

我們可以使用 CSS Modules 來隔離 CSS。

說到 CSS 隔離,單檔元件讓我們非常容易編寫不會洩漏到其他組件的 CSS,只需使用 <style scoped> 標籤即可。

如果省略 scoped,你所定義的 CSS 將是全局的。但添加了它,Vue 將自動為組件添加一個特定的類,該類是唯一的且屬於你的應用程序,因此可以確保 CSS 不會洩漏到其他組件。

也許你的 JavaScript 由於某些需要處理的邏輯而變得很大。如果希望使用一個獨立的檔案來管理 JavaScript,該怎麼辦?

你可以使用 src 屬性外部化它:

<template>
   <p>{{ hello }}</p>
</template>
<script src="./hello.js"></script>

這對於 CSS 也同樣有效:

<template>
   <p>{{ hello }}</p>
</template>
<script src="./hello.js"></script>
<style src="./hello.css"></style>

請注意我在組件的 JavaScript 中使用了:

export default {
   data() {
      return {
         hello: 'Hello World!'
      }
   }
}

來設置數據。

其他常見的方式還包括:

export default {
   data: function() {
      return {
         name: 'Flavio'
      }
   }
}

(上面的方式相當於我們之前的做法)

或者:

export default {
   data: () => {
      return {
         name: 'Flavio'
      }
   }
}

這是不同的,因為它使用了箭頭函數。箭頭函數在我們需要訪問組件方法時無法正確運作,因為我們需要使用 this,而箭頭函數不會綁定該屬性到組件。所以,必須使用常規函數而不是箭頭函數。

你還可能看到:

module.exports = {
   data: () => {
      return {
         name: 'Flavio'
      }
   }
}

這種方式是使用 CommonJS 語法,也可以運作,但建議使用 ES 模塊語法,因為它是 JavaScript 的標準語法。