欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Vue Computed中g(shù)et和set的用法及Computed與watch的區(qū)別

 更新時(shí)間:2023年11月16日 14:20:51   作者:前端程序猿微涼  
這篇文章主要介紹了Vue Computed中g(shù)et和set的用法及Computed與watch的區(qū)別,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教

vue的computed方法

vue.js的computed方法

計(jì)算屬性是基于它們的依賴進(jìn)行緩存的,只在相關(guān)依賴發(fā)生改變時(shí)它們才會(huì)重新求值。

用 methods 也可以實(shí)現(xiàn)同樣的效果,但 methods 在重新渲染的時(shí)候會(huì)重新調(diào)用執(zhí)行,在性能上 computed 優(yōu)于 methods,當(dāng)不需要緩存時(shí)可用 methods。

computed回調(diào)函數(shù)域中的回調(diào)函數(shù)方法可以在插值表達(dá)式{{}}中直接獲取返回結(jié)果而無(wú)需在data數(shù)據(jù)域中定義相關(guān)的屬性,這一點(diǎn)相較于watch中而言使用起來(lái)也更方便些。

get

一般情況下,我們只是使用了computer中的gettter屬性,默認(rèn)只有 getter,我們只是單純的使用了gettter屬性。

set

只有當(dāng)computed監(jiān)測(cè)的值變化的時(shí)候,set才回被調(diào)用。

computed中g(shù)et和set的栗子(引用官網(wǎng))

        var vm = new Vue({
        data: { a: 1 },
        computed: {
            // 僅讀取
            aDouble: function () {
            return this.a * 2
            },
            // 讀取和設(shè)置
            aPlus: {
                // 頁(yè)面初始化時(shí)會(huì)先執(zhí)行一次 get 好比與computed的getter屬性
                // 監(jiān)視 data 中 a 的屬性值,只有發(fā)生改變時(shí),它們才會(huì)重新求值,否則取緩存中的
            get: function () {      
                console.log('調(diào)用了getter屬性')
                return this.a + 1
            },
            // 監(jiān)視當(dāng)前屬性值的變化,當(dāng)屬性值發(fā)生變化時(shí)執(zhí)行,
            // 更新相關(guān)的屬性數(shù)據(jù),類似于 watch 的功能
            set: function (newValue) {
            console.log('調(diào)用了settter屬性')
            console.log(newValue,'newValue');
                    this.a = newValue - 1
                }
            }
        }
        })
        vm.aPlus   // => 2
        console.log(vm.aPlus,'第一次執(zhí)行的vm.aPlus');
        // DOM 還沒(méi)更新
        console.log(vm.a,'第一次vm.a');
        // 當(dāng)監(jiān)聽(tīng)到值變化時(shí) 執(zhí)行set
        vm.aPlus = 4
        console.log(vm.aPlus,'第二次執(zhí)行的vm.aPlus');
        console.log(vm.a,'第二次vm.a');
        // vm.$nextTick方法 將回調(diào)延遲到下次 DOM 更新循環(huán)之后執(zhí)行。
        // 在修改數(shù)據(jù)之后立即使用它,然后等待 DOM 更新。
        // 它跟全局方法 Vue.nextTick 一樣,不同的是回調(diào)的this自動(dòng)綁定到調(diào)用它的實(shí)例上。
        vm.$nextTick(function () {
        // DOM 現(xiàn)在更新了
            console.log(vm.a,'this.vm.a');
        })
        // 更新后data中a為3
        vm.aDouble // => 6
        console.log(vm.a,'vm.aDouble中的a',vm.aDouble,'vm.aDouble');

可以看打印結(jié)果

watch 方法

1.通過(guò)  watch  監(jiān)聽(tīng)  data  數(shù)據(jù)的變化,數(shù)據(jù)發(fā)生變化時(shí),就會(huì)打印當(dāng)前的值 

watch: {
    data(val, value) {
        console.log(val)
        console.log(value)
    }
}

2.通過(guò)  watch  監(jiān)聽(tīng)  list  數(shù)據(jù)的變化,數(shù)據(jù)發(fā)生變化時(shí),this.number++(使用深度監(jiān)聽(tīng))

data() {
    return {
        list: {
            'id': 1,
            'type': 0
        },
        number: 0
    }
},
watch: {
    list: {
        handler(newVal) {
            this.number++
        },
        deep: true
    }
}

3.  通過(guò)  watch  監(jiān)聽(tīng)  data  數(shù)據(jù)的變化,數(shù)據(jù)發(fā)生變化時(shí),執(zhí)行 change 方法

watch: {
    data: 'change' // 值可以為methods的方法名
},
methods: {
    change(curVal,oldVal){
   console.log(curVal,oldVal)
  }
}

watch中的immediate、handler和deep屬性

1.  immediate    和   handler

這樣使用watch時(shí)有一個(gè)特點(diǎn),就是當(dāng)值第一次綁定時(shí),不會(huì)執(zhí)行監(jiān)聽(tīng)函數(shù),只有值發(fā)生改變時(shí)才會(huì)執(zhí)行。如果我們需要在最初綁定值的時(shí)候也執(zhí)行函數(shù),則就需要用到immediate屬性。

data() {
    return {
        list: {
            'id': 1,
            'type': 0
        },
        number: 0
    }
},
watch: {
    list: {
        handler(newVal) {
            this.number++
        },
        immediate: true
    }
}

2.  deep

當(dāng)需要監(jiān)聽(tīng)一個(gè)對(duì)象的改變時(shí),普通的watch方法無(wú)法監(jiān)聽(tīng)到對(duì)象內(nèi)部屬性的改變,此時(shí)就需要deep屬性對(duì)對(duì)象進(jìn)行深度監(jiān)聽(tīng)。

data() {
    return {
        list: {
            'id': 1,
            'type': 0
        },
        number: 0
    }
},
watch: {
    list: {
        handler(newVal) {
            this.number++
        },
        deep: true
    }    
}

設(shè)置deep:true則可以監(jiān)聽(tīng)到   list.id  的變化,此時(shí)會(huì)給 list  的所有屬性都加上這個(gè)監(jiān)聽(tīng)器,當(dāng)對(duì)象屬性較多時(shí),每個(gè)屬性值的變化都會(huì)執(zhí)行   handler。

如果只需要監(jiān)聽(tīng)對(duì)象中的一個(gè)屬性值,則可以做以下優(yōu)化:使用字符串的形式監(jiān)聽(tīng)對(duì)象屬性:

data() {
    return {
        list: {
            'id': 1,
            'type': 0
        }
    }
},
watch: {
    'list.id': {
        handler(newVal, oldVal) {
             ......
        },
    deep: true
    }    
}

結(jié)論:數(shù)組(一維、多維)的變化不需要通過(guò)深度監(jiān)聽(tīng),對(duì)象數(shù)組中對(duì)象的屬性變化則需要deep深度監(jiān)聽(tīng)。

computed與watch的區(qū)別

computed與watch的不同點(diǎn)

觸發(fā)條件不同

  • computed計(jì)算屬性會(huì)依賴于使用它的data屬性,只要是依賴的data屬性值有變動(dòng),則自定義重新調(diào)用計(jì)算屬性執(zhí)行一次。 
  • watch則是在監(jiān)控的data屬性值發(fā)生變動(dòng)時(shí),其會(huì)自動(dòng)調(diào)用watch回調(diào)函數(shù)。

執(zhí)行速度不同

  • computed計(jì)算屬性的值是直接從緩存中獲取,而不是重新編譯執(zhí)行一次,因而其性能要高一些,尤其是在data屬性中的值無(wú)變化,而重復(fù)調(diào)用computed回調(diào)函數(shù)時(shí)更是如此,所以說(shuō)在Vue中,應(yīng)該盡可能的多使用computed替代watch。
  • watch中的值需要data屬性重新編譯執(zhí)行,因而其性能方面會(huì)有所損失。

使用方式不同

  • computed計(jì)算屬性的回調(diào)函數(shù)方法可以直接在頁(yè)面中通過(guò)插值表達(dá)式——{{}}來(lái)獲取。此時(shí)我們不需要再data數(shù)據(jù)域中再定義一個(gè)與方法名相同的屬性。
  • watch中的方法名必須是data數(shù)據(jù)域中所存在的,否則無(wú)法使用。

相同點(diǎn)

都可以實(shí)現(xiàn)通過(guò)監(jiān)控data數(shù)據(jù)域中屬性值的變化來(lái)觸發(fā)相應(yīng)的回調(diào)函數(shù),進(jìn)而實(shí)現(xiàn)我們特殊的邏輯業(yè)務(wù)處理功能。 

項(xiàng)目中的使用總結(jié)

1.在methods中,對(duì)于data中在視圖中需要的任一個(gè)數(shù)據(jù)發(fā)生變化,都會(huì)重新更新視圖,不會(huì)緩存數(shù)據(jù)。

2.在computed中,計(jì)算過(guò)后會(huì)有緩存結(jié)果,下次調(diào)用時(shí)候,直接取緩存的結(jié)果,除非所依賴的響應(yīng)式數(shù)據(jù)發(fā)生變化才會(huì)再次執(zhí)行,計(jì)算內(nèi)部一定有return。(在用的時(shí)候直接寫(xiě)函數(shù)名字)

當(dāng)一個(gè)屬性受多個(gè)屬性影響的時(shí)候就需要用到computed 最典型的栗子:購(gòu)物車商品結(jié)算的時(shí)候

3.監(jiān)聽(tīng)指定的響應(yīng)式數(shù)據(jù)發(fā)生變化,如果有變化會(huì)重新調(diào)用。

當(dāng)一條數(shù)據(jù)影響多條數(shù)據(jù)的時(shí)候就需要用watch  栗子:搜索數(shù)據(jù)

以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。

相關(guān)文章

  • 淺析Vue 中的 render 函數(shù)

    淺析Vue 中的 render 函數(shù)

    在vue中我們使用模板HTML語(yǔ)法組建頁(yè)面的,使用render函數(shù)我們可以用js語(yǔ)言來(lái)構(gòu)建DOM,今天小編就通過(guò)本文給大家簡(jiǎn)單介紹下Vue 中 render 函數(shù),需要的朋友可以參考下
    2020-02-02
  • vant中field組件label屬性兩端對(duì)齊問(wèn)題及解決

    vant中field組件label屬性兩端對(duì)齊問(wèn)題及解決

    這篇文章主要介紹了vant中field組件label屬性兩端對(duì)齊問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-05-05
  • 關(guān)于vue?src路徑動(dòng)態(tài)拼接的小知識(shí)

    關(guān)于vue?src路徑動(dòng)態(tài)拼接的小知識(shí)

    這篇文章主要介紹了vue?src路徑動(dòng)態(tài)拼接的小知識(shí),具有很好的參考價(jià)值,希望對(duì)大家有所幫助。
    2022-04-04
  • Vue3.x最小原型系統(tǒng)講解

    Vue3.x最小原型系統(tǒng)講解

    這篇文章主要介紹了Vue3.x最小原型系統(tǒng)講解。既然用Vue3.0構(gòu)建最小原型系統(tǒng),那么肯定要用尤大的最新構(gòu)建工具Vite來(lái)進(jìn)行項(xiàng)目的初始化,下文舉例說(shuō)明,需要的朋友可以參考一下
    2022-02-02
  • 使用Webpack提升Vue.js應(yīng)用程序的4種方法(翻譯)

    使用Webpack提升Vue.js應(yīng)用程序的4種方法(翻譯)

    這篇文章主要介紹了使用Webpack提升Vue.js應(yīng)用程序的4種方法(翻譯),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-10-10
  • Vue請(qǐng)求后端接口導(dǎo)出excel表格方式

    Vue請(qǐng)求后端接口導(dǎo)出excel表格方式

    這篇文章主要介紹了Vue請(qǐng)求后端接口導(dǎo)出excel表格方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-04-04
  • Vue Router4 嵌套路由的示例代碼

    Vue Router4 嵌套路由的示例代碼

    在 Vue Router 4 中,嵌套路由是一種非常重要的功能,它允許我們創(chuàng)建更復(fù)雜的 UI 結(jié)構(gòu),同時(shí)保持路由的清晰和易于管理,這篇文章主要介紹了Vue Router4 嵌套路由,需要的朋友可以參考下
    2024-04-04
  • vue 解決數(shù)組賦值無(wú)法渲染在頁(yè)面的問(wèn)題

    vue 解決數(shù)組賦值無(wú)法渲染在頁(yè)面的問(wèn)題

    今天小編就為大家分享一篇vue 解決數(shù)組賦值無(wú)法渲染在頁(yè)面的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2019-10-10
  • Vue首屏性能優(yōu)化組件知識(shí)點(diǎn)總結(jié)

    Vue首屏性能優(yōu)化組件知識(shí)點(diǎn)總結(jié)

    在本篇文章里小編給大家整理了一篇關(guān)于Vue首屏性能優(yōu)化組件知識(shí)點(diǎn)總結(jié),有需要的朋友們可以跟著學(xué)習(xí)下。
    2021-11-11
  • Proxy中代理數(shù)據(jù)攔截的方法詳解

    Proxy中代理數(shù)據(jù)攔截的方法詳解

    這篇文章主要為大家詳細(xì)介紹了Proxy中代理數(shù)據(jù)攔截的方法,文中的示例代碼講解詳細(xì),對(duì)我們學(xué)習(xí)或工作具有一定的借鑒價(jià)值,需要的可以參考一下
    2022-12-12

最新評(píng)論