Vue中computed和watch使用場景和方法


watch和computed都是以Vue的依賴追蹤機制為基礎,它們都試圖處理這樣一件事情:當某一個數據(稱它為依賴數據)發生變化的時候,所有依賴這個數據的“相關”數據“自動”發生變化,也就是自動調用相關的函數去實現數據的變動

methods用來定義函數,它需要手動調用才能執行,需要像”fuc()”這樣去調用它(假設函數為fuc)

computed是計算屬性,事實上和data對象里的數據屬性是同一類的(使用上),在取值的時候,用this.fullName去取用,就和取data一樣(不要當成函數調用!!)

watch和computed各自處理的數據關系場景不同:

1. watch擅長處理的場景:一個數據影響多個數據
2. computed擅長處理的場景:一個數據受多個數據影響

computed 和 methods相比,computed有緩存,性能開銷小,何謂computed緩存呢?
在改變number(任一跟computed中不相關的數據)時,整個應用會重新渲染,如果使用的是getName ()方法,則這個方法會被重復調用

而computed不會重新計算,只有依賴的值有變化時(該案例中,number不是computed依賴的值),才會去重新計算,這就是computed的緩存

import Vue from 'vue' new Vue({ el: '#root', template: ` <div> <p>Name: {{name}}</p> <p>Name: {{getName()}}</p> <p>Number: {{number}}</p> <p>FullName: {{fullName}}</p> <p><input type="text" v-model="number"></p> <p>FirstName: <input type="text" v-model="firstName"></p> <p>LastName: <input type="text" v-model="lastName"></p> <p>Name: <input type="text" v-model="name"></p> <p>Obj.a: <input type="text" v-model="obj.a"></p> </div> `, data: { firstName: 'Wang', lastName: 'HaiLi', number: 0, fullName: '', obj: { a: 0 } }, computed: { name: { get () { console.log('new name') return `${this.firstName} ${this.lastName}` }, set (name) { const names = name.split(' ') this.firstName = names[0] this.lastName = names[1] } } }, watch: { 'obj.a': { handler () { console.log('obj.a changed') // this.obj.a += 1 // 不要在watch和computed修改當前值,會無限循環 }, immediate: true // 默認只有數據改變才會監聽,第一次不會執行,設置true則第一次也能執行 // deep: true } }, methods: { getName () { console.log('getName invoked') return `${this.firstName} ${this.lastName}` } } })




原文鏈接:https://www.jianshu.com/p/4f2c995b64bc


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM