###### tags: `vue`, `front-end`, `javascript` # 【自學筆記】從0開始學Vue - Day9 關於Vue Watch 關於Vue,一直以來都多少有接觸,但都沒有好好的理解過它 就來做個一系列的學習筆記,紀錄學習Vue的過程吧 基本上就以到處拜讀前輩大神的文章,並整理成我理解的文字的方式進行 --- ### Watch介紹與使用 * 用來監聽實體內==特定的變數==產生變化時,就會執行某個動作。 甚麼意思咧,簡單來說就是 ```htmlembedded= <div id="app"> {{ fullName }} <input type="text" v-model="firstName"> <input type="text" v-model="lastName"> </div> ``` ```javascript= var vm = new Vue({ el: '#app', data: { firstName: 'Niodo', lastName: 'shaba', fullName: 'Niodo shaba' }, watch: { firstName: function (newValue,rawValue) { this.fullName = `${newValue} ${this.lastName}` }, lastName: function (newValue) { this.fullName = `${this.firstName} ${newValue}` }, }, }); ``` ![](https://i.imgur.com/2MX7eWY.png) 當我輸入了資料,就改變了`firstName`或是`lastName` 當這倆改變了就會觸發function,讓`fullName`跟著改變 :::danger 上面這個例子中,如果要一開始就看得到`fullName`,需要給`fullName`設定初始值, 但是這樣也挺奇怪的哦,還沒編輯哪來的值:confused: ::: --- ### immediate屬性 如果我們的`fullName`不設定初始值,並且希望==一開始就顯示==`fullName`的話該怎麼做? 我們可以在`firstName`裡將`immediate` 設為 `true`,讓監聽值在初始和值被改變時觸發`callback handler`。 ```javascript= var vm = new Vue({ el: '#app', data: { firstName: 'Niodo', lastName: 'shaba', // 將初始值拿掉 fullName: '' }, watch: { firstName:{ immediate: true, handler(newVal,oldValue){ this.fullName=`${newVal} ${this.lastName}` }, }, lastName: function (newValue) { this.fullName = `${this.firstName} ${newValue}` }, }, }); ``` 這樣一來,在初始時就會觸發`handler`,讓`fullName`吃到值了 --- ### deep屬性 `watch`預設不做深層檢查,若需要監看的資料在不同層的話,該怎麼做呢? 我們多宣告一組 `data` 來存資料,並在之中設置 `deep:true` ```javascript= data: { user: { firstName: 'Niodo', lastName: 'shaba', fullName: 'Niodo shaba' } }, /* 不論哪個改了都跳通知 */ user: { handler: function (val, oldVal) { alert('user內的資料改變了'); }, deep: true } ``` 缺點:只要user中的資料變動,就會進行更動,如此一來==非常耗能==。 :::info 補充:若是只想要`watch`深層的某個欄位,可以用這個方法處理 ::: ```javascript= data: { user: { firstName: 'Niodo', lastName: 'shaba', fullName: 'Niodo shaba' } }, watch:{ 'user.firstName':function(value){ alter('user的姓氏改變了,改成:' + value) } } ``` --- *參考資料: https://reurl.cc/XLM8d0* *新手工程師的筆記,純粹記錄學了些啥東西 如果有前輩高人讀了我的文,文中有任何錯誤再麻煩指教指教*