VUE簡介

Vue為用於構建單頁應用程式的使用者界面的漸進式框架,Vue的核心庫只關注視圖層,不僅容易上手,也便於與第三方程式或既有項目整合。

先修課程

修習本課程之前,比需先完成下列3種課程:

執行環境

開發工具

開發工具請參閲 HTML 網頁程式 課程中的網頁開發工具

Vue 套件安裝

Vue 可透過 CDN 方式安裝,分為

  • 開發版:包括有用的控制台警告訊息
  • 發行版:針對檔案大小和速度進行了優化
<!-- VUE 開發版 -->
<script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>

<!-- VUE 發行版 -->
<script src="https://cdn.jsdelivr.net/npm/vue@2"></script>

基本的 Vue 網頁架構如下:

<!DOCTYPE html>
<html>
<head>
    <!-- 採用 Unicode utf-8 編碼 -->
    <meta charset="utf-8" />

    <!-- 設定寬度自動符合手機螢幕寬度 -->
    <meta name="viewport" content="width=device-width, initial-scale=1">

    <!-- VUE 開發版 -->
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue-router"></script>    
    <title></title>
</head>
<body>
    <!-- VUE DOM 區塊,應用程式ID為 app -->
    <div id="app">
    </div>

    <script>
        // 建立 Vue 物件
        var vm = new Vue({
            el: '#app',
            data: { }
        });
    </script>
</body>
</html>

後續程式範例,請利用下列程式模板,將程式碼填入到<body></body>區塊内,並以瀏覽器執行。

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <script src="https://cdn.jsdelivr.net/npm/vue@2"></script>
    <script src="https://cdn.jsdelivr.net/npm/vue-router"></script>    
    <title></title>
</head>
<body>
    <!-- 後續範例請複製到這後才能正常執行 -->
</body>
</html>

渲染

Vue主要透過模板的語法,以聲明式的將數據渲染進HTML 的 DOM 系統,下例中,在data物件中宣告了變數 msg,再透過Vue的綁定功能將内容渲染到<h1>元素内。

In [1]:
<div id="bide-1">
  <h1>Vue {{ msg }}</h1>
</div>

<script>
var vm = new Vue({
  el: '#bide-1',
  data: { 
     msg: '你好!' 
  }
});
</script>

Vue {{ msg }}

動態綁定

如上例中,資料綁定最常見的形式就是使用雙大括號在文件中插值,當資料msg内容變動時,插值處的內容都會更新。上例也可以透過 v-text 或 v-html 指令來完成。兩者的差別在於 v-text會把字串中的html指令,當作是純文字處理:

In [2]:
<div id="bide-2">
  <!--使用v-text,會把指令當文字-->
  <h3 v-text="msg"></h3>
    
  <!--使用v-html,會顯示斜體-->
  <h3 v-html="msg"></h3>
</div>

<script>
var vm = new Vue({
  el: '#bide-2',
  data: { 
    msg: '<i>Vue 你好</i>' 
  }
});
</script>

動態屬性綁定 v-bind

使用v-bind指令可以讓 HTML屬性具有動態綁定的功能:

In [3]:
<div id="bide-3">
  <!--使用 v-bind: 綁定 href 屬性-->
  <a v-bind:href="url">動態網址綁定</a>

  <!-- v-bind可以省略 -->
  <a :href="url">動態網址綁定</a>
</div>

<script>
var vm = new Vue({
  el: '#bide-3',
  data: {
    url: 'http://ewin.tw/app/vue'
  }
});
</script>

使用JavaScript 表達式

在前面的例子中,一直都只綁定簡單的資料變數,實際上可以使用單一表達式的JavaScript,例如:

In [4]:
<div id="bide-4">
  <!--依據option來決定綁定的網址-->
  <a :href="option==2 ? url1 : url2">動態網址綁定</a>
</div>

<script>
var vm = new Vue({
  el: '#bide-4',
  data: {
    option: 1,
    url1: 'http://ewin.tw/app/vue',
    url2: 'http://ewin.tw/app/python'
  }
});
</script>

計算屬性 (Computed Properties)

動態綁定中僅適合用於簡單的屬性或運算式,若要處理較複雜的屬性,可以透過計算屬性來達成。

In [5]:
<!DOCTYPE html>
<html>
<head>
  <meta name="viewport" content="width=device-width, initial-scale=1>
  <script src="https://cdn.jsdelivr.net/npm/vue"></script>
</head>
<body>
<div id="comput-1">
  <!-- 使用計算屬性來顯示翻轉的字符 -->
  {{ reversedMsg }}
</div>

<script>
  var vm = new Vue({
    el: '#comput-1',
    data: {
      msg: '123456'
    },
    // 計算屬性
    computed: {
      reversedMsg() {
        return this.msg.split('').reverse().join('')
      }
    }
  });
</script>
</body >
</html >
{{ reversedMsg }}

雙向數據綁定 v-model

v-model指令可以用在表單輸入元素上創建雙向數據綁定,它會根據控件類型自動的雙向更新元素,VUE會負責監聽用戶的輸入事件以更新數據,並對一些極端場景進行一些特殊處理。

In [6]:
<div id="model-1">
  <!--顯示 num-->
  <div>數值:{{ num }}</div>
    
  <!--透過 v-model 雙向綁定 num-->
  <input type="number" v-model="num">
    
  <!--透過事件呼叫 plus()更改 num-->
  <button @click="plus">+1</button>
</div>

<script>
  var vm = new Vue({
    el: '#model-1',
    data: {
      num: 10
    },
    methods: {
      plus: function () {
        this.num++;
      }
    }
  })
</script>
數值:{{ num }}

事件

click 事件

Vue 透過 v-on 指令監聽DOM事件,並在觸發時執行JavaScript代碼或函數。

  • v-on:click 事件調用 Vue 的 methods 中定義的事件處理方法。
  • v-on:click 可以簡化為 @click。
  • methods 中定義的方法可以透過 this 存取 data 物件中的屬性。
In [7]:
<div id="event-1">
  <!-- -1 按鈕 -->
  <button v-on:click="minus">-1</button>

  <!-- 唯讀 input -->
  <input type="text" v-model="num" readonly size="4">

  <!-- +1 按鈕 -->
  <button @click="plus">+1</button>
</div>

<script>
var vm1 = new Vue({
  el: '#event-1',
  data: {
    num: 10
  },
  methods: {
    minus: function() { this.num--; },
    plus: function () { this.num++; }
  }
})
</script>

鍵盤事件

Vue允許為v-on在監聽鍵盤事件時添加按鍵修飾符,例如在keyup事件後面加上 up 或 down 修飾符:

  • keyup.right 代表方向鍵 ▶ 放開時呼叫 plus()
  • keyup.left 代表方向鍵 ◀ 放開時呼叫 minus()
In [8]:
<div id="event-2">
  <input type="text" v-model="year" readonly 
         @keyup.right="plus" @keyup.left="minus">
</div>

<script>
  var vm2 = new Vue({
    el: '#event-2',
    data: {
      year: 1970
    },
    methods: {
      minus: function() { this.year--; },
      plus: function () { this.year++; }
    }
  })
</script>
🏠