最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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à)值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教

vue的computed方法

vue.js的computed方法

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

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

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

get

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

set

只有當(dāng)computed監(jiān)測的值變化的時(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: {
                // 頁面初始化時(shí)會先執(zhí)行一次 get 好比與computed的getter屬性
                // 監(jiān)視 data 中 a 的屬性值,只有發(fā)生改變時(shí),它們才會重新求值,否則取緩存中的
            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 還沒更新
        console.log(vm.a,'第一次vm.a');
        // 當(dāng)監(jiān)聽到值變化時(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自動綁定到調(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.通過  watch  監(jiān)聽  data  數(shù)據(jù)的變化,數(shù)據(jù)發(fā)生變化時(shí),就會打印當(dāng)前的值 

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

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

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

3.  通過  watch  監(jiān)聽  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í),不會執(zhí)行監(jiān)聽函數(shù),只有值發(fā)生改變時(shí)才會執(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)聽一個(gè)對象的改變時(shí),普通的watch方法無法監(jiān)聽到對象內(nèi)部屬性的改變,此時(shí)就需要deep屬性對對象進(jìn)行深度監(jiān)聽。

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

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

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

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

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

computed與watch的區(qū)別

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

觸發(fā)條件不同

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

執(zhí)行速度不同

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

使用方式不同

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

相同點(diǎn)

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

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

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

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

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

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

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

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

相關(guān)文章

  • vue3中addRoute路由變化頁面未刷新問題解決

    vue3中addRoute路由變化頁面未刷新問題解決

    這篇文章主要為大家介紹了vue3中addRoute路由變化但頁面未刷新問題解決,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-06-06
  • Vue+Canvas繪圖使用的講解

    Vue+Canvas繪圖使用的講解

    這篇文章主要介紹了Vue+Canvas繪圖的使用方式,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-08-08
  • 淺談super-vuex使用體驗(yàn)

    淺談super-vuex使用體驗(yàn)

    super-vuex是一套用于簡化Vuex的數(shù)據(jù)架構(gòu)。這篇文章主要介紹了淺談super-vuex使用體驗(yàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2018-06-06
  • vue常用的數(shù)字孿生可視化的自適應(yīng)方案

    vue常用的數(shù)字孿生可視化的自適應(yīng)方案

    這篇文章主要為大家介紹了vue常用的數(shù)字孿生可視化的自適應(yīng)方案詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-07-07
  • 通過vue寫一個(gè)瀑布流插件代碼實(shí)例

    通過vue寫一個(gè)瀑布流插件代碼實(shí)例

    這篇文章主要介紹了通過vue寫一個(gè)瀑布流插件代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2019-09-09
  • Vue項(xiàng)目打包部署的實(shí)戰(zhàn)過程記錄

    Vue項(xiàng)目打包部署的實(shí)戰(zhàn)過程記錄

    我們使用nginx部署Vue項(xiàng)目,實(shí)質(zhì)上就是將Vue項(xiàng)目打包后的內(nèi)容同步到nginx指向的文件夾,下面這篇文章主要給大家介紹了關(guān)于Vue項(xiàng)目打包部署的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • VUE3+vite項(xiàng)目中動態(tài)引入組件與異步組件的詳細(xì)實(shí)例

    VUE3+vite項(xiàng)目中動態(tài)引入組件與異步組件的詳細(xì)實(shí)例

    在做vue3項(xiàng)目中時(shí),每次使用都需要先進(jìn)行引入,下面這篇文章主要給大家介紹了關(guān)于VUE3+vite項(xiàng)目中動態(tài)引入組件與異步組件的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • Vue關(guān)閉當(dāng)前彈窗頁面的兩種方式

    Vue關(guān)閉當(dāng)前彈窗頁面的兩種方式

    這篇文章主要給大家介紹了關(guān)于Vue關(guān)閉當(dāng)前彈窗頁面的兩種方式,這是最近項(xiàng)目中遇到的一個(gè)需求,文中通過實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-07-07
  • 在vue-cli中組件通信的方法

    在vue-cli中組件通信的方法

    本篇文章主要介紹了在vue-cli中組件通信的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧
    2017-12-12
  • Vue實(shí)現(xiàn)成績增刪案例思路詳解

    Vue實(shí)現(xiàn)成績增刪案例思路詳解

    這篇文章主要介紹了Vue實(shí)現(xiàn)成績增刪案例思路詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),感興趣的朋友一起看看吧
    2025-05-05

最新評論

兴义市| 万荣县| 新干县| 会东县| 凤翔县| 航空| 红安县| 亚东县| 建湖县| 天峻县| 博爱县| 阿克陶县| 泸溪县| 新河县| 申扎县| 乾安县| 富源县| 庄浪县| 柞水县| 通河县| 铁力市| 浦江县| 乐平市| 集贤县| 翁牛特旗| 资溪县| 海盐县| 公主岭市| 寿阳县| 青河县| 翼城县| 资兴市| 都昌县| 奇台县| 乌鲁木齐县| 金平| 原阳县| 商河县| 巴林右旗| 尚义县| 连云港市|