Vue計算屬性與監視屬性實現方法詳解
一、計算屬性
在開發中,可以有這樣的需求,在屬性(date)中,有fistName和lastName兩個屬性,需要將兩個屬性拼接起來,這種需求也很簡單,有以下實現方式
1、插值語法實現
直接在body中將兩個數據拼接
<div id="root"> 姓:<input type="text" v-model="fistName"><br><br> 名:<input type="text" v-model="lastName"><br><br> 姓名:<span>{{fistName + lastName}}</span> </div>
2、通過方法實現
編寫一個方法,返回值為兩者拼在一起的字符串
<div id="root"> 姓:<input type="text" v-model="fistName"><br><br> 名:<input type="text" v-model="lastName"><br><br> <!-- 隻要數據發生改變,這個方法就會再被調用一次 --> 姓名:<span>{{fullName()}}</span> </div>
new Vue({ el:'#root', data:{ fistName:'張', lastName:'三' }, methods: { fullName(){ return this.fistName + this.lastName; } }, })
3、通過計算屬性
計算屬性就是vue中的computed,這裡面存放的是計算屬性
而data中的是屬性,兩者不一樣
<div id="root"> 姓:<input type="text" v-model="fistName"><br><br> 名:<input type="text" v-model="lastName"><br><br> 姓名:<span>{{fullName}}</span> </div>
const vm = new Vue({ el:'#root', //屬性 data:{ fistName:'張', lastName:'三' }, // 計算屬性 computed:{ fullName:{ //當有人讀取fullName時,get就會被調用,返回值為fullName的值 //get調用時機 //1、初次讀取fullName //2、所依賴的數據變化時 get(){ //這裡的this是指vm return this.fistName + this.lastName; }, //當fullName被調用時候調用 set(value){ const arr = value.split('-') this.fistName = arr[0] this.lastName = arr[1] } } } })
計算屬性和方法的編寫方式有點區別
- {{}}中方法是寫一個方法的,即帶括號
- 但是計算屬性隻需要寫名字即可,不用帶花括號
計算屬性中要編寫兩個方法,一個是get方法,另一個是set方法
- 當有人讀取fullname這個計算屬性,get方法就會被調用,返回值是fullname的值
- 當有人修改fullname這個計算屬性,set方法就會被調用
當明確隻有get方法,不需要set方法的時候,計算屬性可以簡寫成如下:
fullName(){ return this.fistName + this.lastName; }
get函數什麼時候執行:
- 初次讀取時會執行一次
- 當依賴的數據發生變化時會被調用一次
計算屬性的優勢
相對於方法來說,計算屬性內部有緩存機制(復用),效率更好,調試更方便
簡單來說,倘若計算屬性不變,計算屬性的數據就會存進緩存中,當頁面上的其他數據需要讀取這個計算屬性的話,不再需要從vm獲取,直接從緩存裡面獲取
二、監視屬性
監視屬性可以監視某個屬性的變化,並且可以獲取變化前和變化後的數值
通過關鍵詞watch實現
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <script type="text/javascript" src="../js/vue.js"></script> </head> <body> <div id="root"> <h2>今天天氣很{{info}}</h2> <button @click="changgeWeather">切換天氣</button> </div> </body> <script> Vue.config.productionTip = false; const vm = new Vue({ el: "#root", data: { isHot: true, }, computed: { info() { return this.isHot ? "炎熱" : "涼爽"; }, }, methods: { changgeWeather() { this.isHot = !this.isHot; }, }, // 監視 //適用於一開始很明確地知道要監視誰 watch: { isHot: { //初始化時讓handler調用一下 immediate: true, //什麼時候調用?當isHost發生改變時 handler(newValue, oldValue) { console.log("isHost被調用", newValue, oldValue); } }, // } }); </script> </html>
例如如上案例,當isHost被修改的時候,監視屬性中的isHost中的handler就會被調用
而 immediate: true 的作用是再初始化的時候調用一下這個監視屬性
註意的是監視屬性必須存在,才可以進行監視
除瞭以上邪惡寫法,還可以通過vm.$watch監視
vm.$watch("isHost", { //初始化時讓handler調用一下 immediate: true, //什麼時候調用?當isHost發生改變時 handler(newValue, oldValue) { console.log("isHost被調用", newValue, oldValue); }, });
兩種的使用場合不同:
- 第一個則是,一開始就很明確這個屬性需要監視,則寫在vue裡面
- 第二個則是,一開始不知道這個屬性需要被監視,然後後面加上的,就可以用vm.$watch
當監視屬性隻有handler的時候,可以進行簡寫
watch: { isHot((newValue, oldValue)): { console.log("isHost被調用", newValue, oldValue); } }
三、深度監視
深度監視主要用於監視層次比較高的
data: { isHot: true, number: { a: 1, b: 1, }, }
例如這個data裡面的number,需要監視裡面的a和b的變化,則需要用到監視屬性
"number.a": { handler(newValue, oldValue) { console.log("a改變", newValue, oldValue); }, },
監視對象裡面的某個屬性,就可以如上這也進行操作,“對象.屬性”表示監視裡面的某一個屬性
同時也可以監視number的變化,隻需要在在裡面開啟深度即可
number:{ //表示深度開啟 deep:true, handler(){ console.log("number發生改變"); }
監視對象裡面的某個屬性,就可以如上這也進行操作,“對象.屬性”表示監視裡面的某一個屬性
同時也可以監視number的變化,隻需要在在裡面開啟深度即可
number:{ //表示深度開啟 deep:true, handler(){ console.log("number發生改變"); }
到此這篇關於Vue計算屬性與監視屬性實現方法詳解的文章就介紹到這瞭,更多相關Vue計算屬性與監視屬性內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 簡單聊聊Vue中的計算屬性和屬性偵聽
- Vue計算屬性與監視(偵聽)屬性的使用深度學習
- Vue中的watch是什麼以及watch和computed的區別
- 詳解Vue的監聽屬性
- Vue監聽屬性圖文實例詳解