vue.js計算屬性computed【getter和setter的一些思考】

前言:

本文主要是針對vue.js計算屬性computed中的getter和setter的一些理解肛宋。

簡單介紹

在 Vue 中汁果,computed 的屬性可以被視為是 data 一樣山卦,可以讀取和設(shè)值聚霜,因此在 computed 中可以分成 getter(讀刃濉) 和 setter(設(shè)值)噩茄,一般情況下是沒有 setter 的,computed 預(yù)設(shè)只有 getter 续徽,也就是只能讀取蚓曼,不能改變設(shè)值。

vue.js計算屬性默認只有 getter钦扭,因為是默認值所以我們也常常省略不寫纫版,如下代碼:

<div id="demo">{{ fullName }}</div>

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'Foo',
    lastName: 'Bar'
  },
  computed: {
    fullName: function () {
      return this.firstName + ' ' + this.lastName
    }
  }
})

其實computed里的代碼完整的寫法應(yīng)該是:

 computed: {
    fullName: {
      get(){
         return this.firstName + ' ' + this.lastName
      }
    }
  }

計算屬性getter的觸發(fā)時間

<template>
    <div id="demo">
         <p> {{ fullName }} </p>
         <input type="text" v-model="firstName">
         <input type="text" v-model="lastName">
    </div>
</template>

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'zhang',
    lastName: 'san'
  },
  computed: {
    fullName: function () {
      console.log('computed getter...')
      return this.firstName + ' ' + this.lastName
    }
  },
  updated () {
     console.log('updated')
  }
})

如果我們改變上邊代碼里的2個輸入框的值firstName或者lastName,都會觸發(fā)computed以及updated ()客情,也就是說會執(zhí)行: console.log('computed getter...')和console.log('updated') (用來驗證是不是執(zhí)行了其弊,沒有其他意思)

需要注意的是,不是說我們更改了getter里使用的變量膀斋,就會觸發(fā)computed的更新瑞凑,前提是computed里的值必須要在模板里使用才行。怎么理解呢概页?

如下代碼,我們把template里的fullName 注釋掉:

<template>
    <div id="demo">
         <!-- <p> {{ fullName }} </p> -->
         <input type="text" v-model="firstName">
         <input type="text" v-model="lastName">
    </div>
</template>

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'zhang',
    lastName: 'san'
  },
  computed: {
    fullName: function () {
      console.log('computed getter...')
      return this.firstName + ' ' + this.lastName
    }
  },
  updated () {
     console.log('updated')
  }
})

就算我們更改了firstName以及l(fā)astName都不會觸發(fā)computed 中的 getter 中的console.log('computed getter...')练慕,而只會觸發(fā)console.log('updated')

計算屬性settter

<template>
    <div id="demo">
         <p> {{ fullName }} </p>
         <input type="text" v-model="fullName">
         <input type="text" v-model="firstName">
         <input type="text" v-model="lastName">
    </div>
</template>

var vm = new Vue({
  el: '#demo',
  data: {
    firstName: 'zhang',
    lastName: 'san'
  },
  computed: {
    fullName: {
      //getter 方法
        get(){
            console.log('computed getter...')
            return this.firstName + ' ' + this.lastName
        }惰匙,
   //setter 方法
        set(newValue){
            console.log('computed setter...')
            var names = newValue.split(' ')
            this.firstName = names[0]
            this.lastName = names[names.length - 1]
            return this.firstName + ' ' + this.lastName
        }
      
    }
  },
  updated () {
     console.log('updated')
  }
})

在template 中,我們可以看到铃将,input 是直接綁 v-model="fullName"项鬼,如果我們這里直接修改了fullName的值,那么就會觸發(fā)setter劲阎,同時也會觸發(fā)getter以及updated函數(shù)绘盟。其執(zhí)行順序是setter -> getter -> updated,如下:

console.log('computed setter...')
console.log('computed getter...')
console.log('updated')

這里需要注意的是,并不是觸發(fā)了setter也就會觸發(fā)getter龄毡,他們兩個是相互獨立的吠卷。我們這里修改了fullName會觸發(fā)getter是因為setter函數(shù)里有改變firstName 和 lastName 值的代碼。也就是說我們?nèi)绻⑨尩羯线叺膕etter中修改firstName 和lastName的代碼后就不會執(zhí)行g(shù)etter沦零,如下:

set(newValue){
            console.log('computed setter...')
            // var names = newValue.split(' ')
           //  this.firstName = names[0]
          //  this.lastName = names[names.length - 1]
          return this.firstName + ' ' + this.lastName
        }

會執(zhí)行祭隔,且順序如下

console.log('computed setter...')
console.log('updated')
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市路操,隨后出現(xiàn)的幾起案子疾渴,更是在濱河造成了極大的恐慌,老刑警劉巖屯仗,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件搞坝,死亡現(xiàn)場離奇詭異,居然都是意外死亡魁袜,警方通過查閱死者的電腦和手機桩撮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來慌核,“玉大人距境,你說我怎么就攤上這事】遄浚” “怎么了垫桂?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長粟按。 經(jīng)常有香客問我诬滩,道長,這世上最難降的妖魔是什么灭将? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任疼鸟,我火速辦了婚禮,結(jié)果婚禮上庙曙,老公的妹妹穿的比我還像新娘空镜。我一直安慰自己,他們只是感情好捌朴,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布吴攒。 她就那樣靜靜地躺著,像睡著了一般砂蔽。 火紅的嫁衣襯著肌膚如雪洼怔。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天左驾,我揣著相機與錄音镣隶,去河邊找鬼极谊。 笑死,一個胖子當(dāng)著我的面吹牛安岂,可吹牛的內(nèi)容都是我干的轻猖。 我是一名探鬼主播,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼嗜闻,長吁一口氣:“原來是場噩夢啊……” “哼蜕依!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起琉雳,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤样眠,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后翠肘,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體檐束,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年束倍,在試婚紗的時候發(fā)現(xiàn)自己被綠了被丧。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡绪妹,死狀恐怖甥桂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情邮旷,我是刑警寧澤黄选,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布,位于F島的核電站婶肩,受9級特大地震影響办陷,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜律歼,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一民镜、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧险毁,春花似錦制圈、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至问窃,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間完沪,已是汗流浹背域庇。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工嵌戈, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人听皿。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓熟呛,卻偏偏與公主長得像,于是被迫代替她去往敵國和親尉姨。 傳聞我的和親對象是個殘疾皇子庵朝,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

推薦閱讀更多精彩內(nèi)容