Vue中computed和watch有哪些區(qū)別
var vm = new Vue({ el: ’#app’, data: { message: ’hello’ }, template: ` <div> <p>我是原始值: '{{ message }}'</p> <p>我是計(jì)算屬性的值: '{{ computedMessage}}'</p> // computed 在 DOM 里直接使用不需要調(diào)用 </div> `, computed: { // 計(jì)算屬性的 getter computedMessage: function () { // `this` 指向 vm 實(shí)例 return this.message.split(’’).reverse().join(’’) } }})
結(jié)果:
我是原始值: 'Hello'我是計(jì)算屬性的值: 'olleH'
如果不使用計(jì)算屬性,那么 message.split(’’).reverse().join(’’) 就會(huì)直接寫到 template 里,那么在模版中放入太多聲明式的邏輯會(huì)讓模板本身過重,尤其當(dāng)在頁(yè)面中使用大量復(fù)雜的邏輯表達(dá)式處理數(shù)據(jù)時(shí),會(huì)對(duì)頁(yè)面的可維護(hù)性造成很大的影響
而且計(jì)算屬性如果依賴不變的話,它就會(huì)變成緩存,computed 的值就不會(huì)重新計(jì)算
所以,如果數(shù)據(jù)要通過復(fù)雜邏輯來得出結(jié)果,那么就推薦使用計(jì)算屬性
偵聽屬性watch 不支持緩存,數(shù)據(jù)變,直接會(huì)觸發(fā)相應(yīng)的操作。 watch支持異步;監(jiān)聽的函數(shù)接收兩個(gè)參數(shù),第一個(gè)參數(shù)是最新的值;第二個(gè)參數(shù)是輸入之前的值; 當(dāng)一個(gè)屬性發(fā)生變化時(shí),需要執(zhí)行對(duì)應(yīng)的操作;一對(duì)多; 監(jiān)聽數(shù)據(jù)必須是data中聲明過或者父組件傳遞過來的props中的數(shù)據(jù),當(dāng)數(shù)據(jù)變化時(shí),觸發(fā)其他操作,函數(shù)有兩個(gè)參數(shù):new Vue({ data: { n: 0, obj: { a: 'a' } }, template: ` <div> <button @click='n += 1'>n+1</button> <button @click='obj.a += ’hi’'>obj.a + ’hi’</button> <button @click='obj = {a:’a’}'>obj = 新對(duì)象</button> </div> `, watch: { n() { console.log('n 變了'); }, obj:{ handler: function (val, oldVal) { console.log('obj 變了') }, deep: true // 該屬性設(shè)定在任何被偵聽的對(duì)象的 property 改變時(shí)都要執(zhí)行 handler 的回調(diào),不論其被嵌套多深 }, 'obj.a':{ handler: function (val, oldVal) { console.log('obj.a 變了') }, immediate: true // 該屬性設(shè)定該回調(diào)將會(huì)在偵聽開始之后被立即調(diào)用 } }}).$mount('#app');
不應(yīng)該使用箭頭函數(shù)來定義 watcher 函數(shù),因?yàn)榧^函數(shù)沒有 this,它的 this 會(huì)繼承它的父級(jí)函數(shù),但是它的父級(jí)函數(shù)是 window,導(dǎo)致箭頭函數(shù)的 this 指向 window,而不是 Vue 實(shí)例
deep 控制是否要看這個(gè)對(duì)象里面的屬性變化 immediate 控制是否在第一次渲染是執(zhí)行這個(gè)函數(shù)vm.$watch() 的用法和 watch 回調(diào)類似
vm.$watch(’data屬性名’, fn, {deep: .., immediate: ..})vm.$watch('n', function(val, newVal){ console.log('n 變了');},{deep: true, immediate: true})總結(jié) 如果一個(gè)數(shù)據(jù)需要經(jīng)過復(fù)雜計(jì)算就用 computed 如果一個(gè)數(shù)據(jù)需要被監(jiān)聽并且對(duì)數(shù)據(jù)做一些操作就用 watch
以上就是Vue中computed和watch有哪些區(qū)別的詳細(xì)內(nèi)容,更多關(guān)于Vue中computed和watch的區(qū)別的資料請(qǐng)關(guān)注好吧啦網(wǎng)其它相關(guān)文章!
相關(guān)文章:
1. 基于javascript處理二進(jìn)制圖片流過程詳解2. JS sort方法基于數(shù)組對(duì)象屬性值排序3. ASP中解決“對(duì)象關(guān)閉時(shí),不允許操作。”的詭異問題……4. JAVA上加密算法的實(shí)現(xiàn)用例5. Django-migrate報(bào)錯(cuò)問題解決方案6. ajax請(qǐng)求添加自定義header參數(shù)代碼7. ASP刪除img標(biāo)簽的style屬性只保留src的正則函數(shù)8. Gitlab CI-CD自動(dòng)化部署SpringBoot項(xiàng)目的方法步驟9. 使用Python和百度語音識(shí)別生成視頻字幕的實(shí)現(xiàn)10. 淺談SpringMVC jsp前臺(tái)獲取參數(shù)的方式 EL表達(dá)式
