Vue中computed與watch何時(shí)使用

computed被叫做計(jì)算屬性:

1.在頁(yè)面中使用大量或是復(fù)雜的表達(dá)式去處理數(shù)據(jù),對(duì)頁(yè)面的維護(hù)會(huì)有很大的影響。這個(gè)時(shí)候就需要用到computed 計(jì)算屬性來(lái)處理復(fù)雜的邏輯運(yùn)算,這樣在頁(yè)面中就可以簡(jiǎn)單的寫(xiě)成{{bookmark}},computed一般是改變data或者props里面的值為己用。

computed: {
            bookmark() {
               //這里用了es6書(shū)寫(xiě)方法
                return this.$store.state.bookmarks.find(bookmark => bookmark.id === this.bookmarkId);
            },
}
<div>{{bookmark}}</div>

2.computed的值不可以在data中定義和賦值

watch被叫做偵聽(tīng)器:
1.雖然計(jì)算屬性在大多數(shù)情況下是非常適合的,但是在有些情況下我們需要自定義一個(gè)watcher,當(dāng)需要在數(shù)據(jù)變化時(shí)執(zhí)行異步或開(kāi)銷(xiāo)較大的操作時(shí),這時(shí)watch是非常有用的。

watch: {
            // 如果 `name` 發(fā)生改變,這個(gè)函數(shù)就會(huì)運(yùn)行
            question: function(newQuestion) {
                this.answer = 'Waiting for you to stop typing...'
                this.getAnswer()
            }
        },
methods: {
            // `_.debounce` 是一個(gè)通過(guò) Lodash 限制操作頻率的函數(shù)。
            // 在這個(gè)例子中,我們希望限制訪問(wèn) yesno.wtf/api 的頻率
            // AJAX 請(qǐng)求直到用戶(hù)輸入完畢才會(huì)發(fā)出。想要了解更多關(guān)于
            // `_.debounce` 函數(shù) (及其近親 `_.throttle`) 的知識(shí),
            // 請(qǐng)參考:https://lodash.com/docs#debounce
            getAnswer: _.debounce(
                function() {
                    if(this.question.indexOf('?') === -1) {
                        this.answer = 'Questions usually contain a question mark. ;-)'
                        return
                    }
                    this.answer = 'Thinking...'
                    var vm = this
                    axios.get('https://yesno.wtf/api')
                        .then(function(response) {
                            vm.answer = _.capitalize(response.data.answer)
                        })
                        .catch(function(error) {
                            vm.answer = 'Error! Could not reach the API. ' + error
                        })
                },
                // 這是我們?yōu)榕卸ㄓ脩?hù)停止輸入等待的毫秒數(shù)
                500
            )
        }

在這個(gè)示例中,使用 watch 選項(xiàng)允許我們執(zhí)行異步操作 (訪問(wèn)一個(gè) API),限制我們執(zhí)行該操作的頻率,并在我們得到最終結(jié)果前,設(shè)置中間狀態(tài)。這些都是計(jì)算屬性無(wú)法做到的。
2.watch可以進(jìn)行深度監(jiān)聽(tīng),監(jiān)聽(tīng)對(duì)象的變化。

data() {
            return {
                group: {
                        data1: '1',
                        data2: '2',
                        data3:'3'
                },
            }
}

如果我們要監(jiān)聽(tīng)group的data1的變化

watch: {
     group: {
         data1: function() {
            //do something
         },
         deep: true
     }
}

里面的deep設(shè)為了true,這樣的話(huà),如果修改了這個(gè)group中的任何一個(gè)屬性,都會(huì)執(zhí)行handler這個(gè)方法。不過(guò)其實(shí)這樣開(kāi)銷(xiāo)是蠻大的,尤其是對(duì)象里面結(jié)構(gòu)嵌套過(guò)深的時(shí)候。而且有時(shí)候我們就想關(guān)心這個(gè)對(duì)象中的某個(gè)屬性,比如data3,這個(gè)時(shí)候可以這樣:

'group.data3'(newVal) {
        console.log(newVal);
 },

有不完美之處歡迎大家多提意見(jiàn)~~

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Swift1> Swift和OC的區(qū)別1.1> Swift沒(méi)有地址/指針的概念1.2> 泛型1.3> 類(lèi)型嚴(yán)謹(jǐn) 對(duì)...
    cosWriter閱讀 11,666評(píng)論 1 32
  • vue概述 在官方文檔中,有一句話(huà)對(duì)Vue的定位說(shuō)的很明確:Vue.js 的核心是一個(gè)允許采用簡(jiǎn)潔的模板語(yǔ)法來(lái)聲明...
    li4065閱讀 7,624評(píng)論 0 25
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評(píng)論 19 139
  • 這一兩年來(lái),董卿刷屏已經(jīng)不止一次兩次了。 說(shuō)起董卿,大家想到的第一個(gè)詞,早已不是“央視一姐”,而是“三次下跪采訪老...
    晴天_彩虹閱讀 1,196評(píng)論 0 0
  • 最近這幾天遇到各種各樣的小事,腦海里總會(huì)冒出一句話(huà)-其實(shí),每個(gè)人都不容易! ...
    不愛(ài)看書(shū)的壞孩子閱讀 287評(píng)論 0 1

友情鏈接更多精彩內(nèi)容