昨天介紹了 VueJs 裡常用的模板語法,今天就來介紹在我們 new Vue({ })
裡面會用到到的 computed(計算屬性)和 watch(監視器)
我們可以先來看一下範例:去 codepen 看看效果
同樣的以 cdn 的方式先引入vue.js
。
前兩個是「姓」和「名」的輸入框input
First Name 和 Last Name,先在實例裡的data
初始化他們的值之後,就可以在各別的input
和p
標籤看到它們顯示出來,現在要來進行將「姓」和「名」合併,且可以透過這些input
去直接更改已經初始化的值。
合併「姓」和「名」的三個輸入框fullName
則是想做到讓姓和名可綁定,並顯示在輸入框裡。
前兩個是單向改變,也就是說在「姓」和「名」的輸入會影響 Full Name1 和 Full Name2,但改變 Full Name1 和 Full Name2 時「姓」和「名」的內容不會更動。
最後一個是雙向的,也就是說無論是「姓」和「名」的輸入或是 Full Name3 裡的更動,兩邊的內容都會一起變動。
這幾個輸入框都是用v-model
來綁定。
1 | <div id="app2"> |
先來說明這幾個在實例裡的屬性,這些屬性都是物件。
computed: { } 計算屬性
computed 是實例裡的一個屬性,而它的值是個物件,在物件裡可能會有:
- 多個方法的物件,對狀態屬性進行計算後,回傳一個新的資料, 供頁面獲取顯示。
- 自定義方法,一般情況下,相當是一個只能讀取的屬性,可利用 set/get 方法來實現屬性資料的計算讀取, 同時監視屬性資料的變化
如何給物件定義 get/set
屬性 ?
在建立物件時指定:·get name () {return xxx} / set name (value) {}
物件建立之後指定: Object.defineProperty(obj, age, {get(){}, set(value){}})
在頁面中使用雙大括號,將「方法名」包起來顯示計算的結果。
使用 computed 計算屬性的 get / set 方法雙向顯示和監視
剛剛說的 Full Name3 可達到互相牽動的效果,就是用 computed 計算屬性裡的兩個 callback 函式 getter/setter 來做到。get()
我們需要讀取當前屬性時呼叫。然後根據相關的資料計算並傳回當前屬性的值。set(value)
並不像字面上的意思,比較像是「監視」,而是當屬性值發生變化呼叫 set callback 函式,然後去更新相關的屬性資料。在這裏value
即代表 Full Name3 最新的屬性值。
如果是以 computed 來計算屬性產生值,就不需要在data
裡初始化值。所以我們也不需要在data
裡初始化 Full Name3 的值。
計算屬性 computed 有個特性,它會在第一次計算時就將結果存在快取裡, 多次讀取也只執行一次 getter 計算,以節省效能。
watch 監視器
監視器的寫法有兩種:
- 直接寫成實例的
watch
屬性物件,屬性的值為監聽的對象,值則 callback 函式,在函數內部進行計算。這個監聽屬性可包含多個屬性監視的物件,並分為一般監視和深度deep
監視。 - 透過實例本身(vm)有的方法
$watch()
來監聽$watch
有兩個參數,第一個為要監聽的對象,第二參數為 callback 函式,在函數內部進行計算。
有沒覺得這兩種寫法大同小異?
這兩種寫法的語法分別為:
1 | // 1. |
所有 Vue 實例的方法,如 watch ,都可以在前面加個$
字號,而在實例外取得,如上面vm.$watch()
的用法。
我們再來看一下完整的程式碼:
1 | const vm = new Vue({ |
有趣的 callback 解釋
callback 函式需滿足三個條件: 1.你定義的 2.你沒有呼叫 3.但最終它執行了
callback 什麼時候用? 呼叫函式的時候
用來做什麼? 計算並回傳當前屬性的值
再接再厲~