Vue中computed刨晴、methods和watch之間的區(qū)別

對(duì)于那些開始學(xué)習(xí)Vue的人來說屉来,對(duì)于方法、計(jì)算屬性和觀察者之間的區(qū)別有點(diǎn)混淆狈癞。

盡管通城芽浚可以使用它們中的每一個(gè)來完成或多或少相同的事情,但了解每個(gè)人在哪里勝過其他人還是很重要的蝶桶。

在這個(gè)快速提示中慨绳,我們將了解Vue應(yīng)用程序的這三個(gè)重要方面及其用例。我們將通過使用這三種方法中的每一種構(gòu)建相同的搜索組件來實(shí)現(xiàn)這一點(diǎn)真竖。

Methods
在一個(gè)方法中脐雪,或多或少是您所期望的——一個(gè)對(duì)象屬性的函數(shù)。您可以使用方法對(duì)發(fā)生在DOM中的事件作出反應(yīng)恢共,或者可以從組件中的其他位置調(diào)用它們战秋,例如,從計(jì)算屬性或觀察者中調(diào)用它們讨韭。方法用于對(duì)公共功能進(jìn)行分組-例如脂信,處理表單提交,或構(gòu)建可重用的功能透硝,如發(fā)出Ajax請(qǐng)求狰闪。

在Vue實(shí)例中的methods對(duì)象內(nèi)創(chuàng)建方法:

new Vue({
  el: "#app",
  methods: {
    handleSubmit() {}
  }
})

當(dāng)您想在模板中使用它時(shí),您可以這樣做:

<div id="app">
  <button @click="handleSubmit">
    Submit
  </button>
</div>

我們使用v-on指令將事件處理程序附加到dom元素濒生,該元素也可以縮寫為@符號(hào)埋泵。
現(xiàn)在,每次單擊按鈕時(shí)都會(huì)調(diào)用handleSubmit方法。對(duì)于要傳遞方法體中需要的參數(shù)的實(shí)例丽声,可以執(zhí)行以下操作:

<div id="app">
  <button @click="handleSubmit(event)">
    Submit
  </button>
</div>

這里我們傳遞一個(gè)事件對(duì)象礁蔗,例如,它允許我們?cè)诒韱翁峤坏那闆r下阻止瀏覽器的默認(rèn)操作雁社。

但是瘦麸,當(dāng)我們使用一個(gè)指令來附加事件時(shí),我們可以使用一個(gè)修飾符來更優(yōu)雅地實(shí)現(xiàn)相同的事情:@click.stop=“handleSubmit”歧胁。

現(xiàn)在我們來看一個(gè)使用方法過濾數(shù)組中數(shù)據(jù)列表的示例。

In the demo, we want to render a list of data and a search box. The data rendered changes whenever a user enters a value in the search box. The template will look like this:
在演示中厉碟,我們要呈現(xiàn)一個(gè)數(shù)據(jù)列表和一個(gè)搜索框喊巍。每當(dāng)用戶在搜索框中輸入值時(shí),所呈現(xiàn)的數(shù)據(jù)都會(huì)發(fā)生更改箍鼓。模板將如下所示:

<div id="app">
  <h2>Language Search</h2>

  <div class="form-group">
    <input
      type="text"
      v-model="input"
      @keyup="handleSearch"
      placeholder="Enter language"
      class="form-control"
    />
  </div>

  <ul v-for="(item, index) in languages" class="list-group">
    <li class="list-group-item" :key="item">{{ item }}</li>
  </ul>
</div>

如您所見崭参,我們引用的是handlesearch方法,每次用戶在搜索字段中鍵入內(nèi)容時(shí)都會(huì)調(diào)用該方法款咖。我們需要?jiǎng)?chuàng)建方法和數(shù)據(jù):

new Vue({
  el: '#app',
  data() {
    return {
      input: '',
      languages: []
    }
  },
  methods: {
    handleSearch() {
      this.languages = [
        'JavaScript',
        'Ruby',
        'Scala',
        'Python',
        'Java',
        'Kotlin',
        'Elixir'
      ].filter(item => item.toLowerCase().includes(this.input.toLowerCase()))
    }
  },
  created() { this.handleSearch() }
})

handlesearch方法使用輸入字段的值更新列出的項(xiàng)何暮。需要注意的一點(diǎn)是,在methods對(duì)象中铐殃,不需要使用this.handlesearch引用該方法(正如在react中必須做的那樣)

Computed Properties

雖然上面示例中的搜索可以按預(yù)期工作海洼,但更優(yōu)雅的解決方案是使用計(jì)算屬性。計(jì)算屬性對(duì)于從現(xiàn)有源組合新數(shù)據(jù)非常方便富腊,與方法相比坏逢,它們的一大優(yōu)點(diǎn)是緩存了輸出。這意味著赘被,如果獨(dú)立于計(jì)算屬性的某些內(nèi)容在頁面上發(fā)生更改韧拒,并且重新呈現(xiàn)UI巴比,則會(huì)返回緩存的結(jié)果,并且不會(huì)重新計(jì)算計(jì)算計(jì)算屬性,從而避免了可能代價(jià)高昂的操作斑鸦。

計(jì)算屬性使我們能夠使用我們可用的數(shù)據(jù)進(jìn)行即時(shí)計(jì)算。在本例中怎顾,我們有一個(gè)需要排序的項(xiàng)目數(shù)組捉撮。我們希望在用戶在輸入字段中輸入值時(shí)進(jìn)行排序。

我們的模板看起來幾乎與前面的迭代相同球化,除了我們正在傳遞v-for指令一個(gè)計(jì)算屬性(filteredlist):

<div id="app">
  <h2>Language Search</h2>

  <div class="form-group">
    <input
      type="text"
      v-model="input"
      placeholder="Enter language"
      class="form-control"
    />
  </div>

  <ul v-for="(item, index) in filteredList" class="list-group">
    <li class="list-group-item" :key="item">{{ item }}</li>
  </ul>
</div>
  

腳本部分略有不同秽晚。我們聲明了數(shù)據(jù)屬性中的語言(以前這是一個(gè)空數(shù)組),而不是方法筒愚,我們將邏輯移入了計(jì)算屬性:

new Vue({
  el: "#app",
  data() {
    return {
      input: '',
      languages: [
        "JavaScript",
        "Ruby",
        "Scala",
        "Python",
        "Java",
        "Kotlin",
        "Elixir"
      ]
    }
  },
  computed: {
    filteredList() {
      return this.languages.filter((item) => {
        return item.toLowerCase().includes(this.input.toLowerCase())
      })
    }
  }
})

filteredList計(jì)算屬性將包含包含輸入字段值的項(xiàng)數(shù)組赴蝇。在第一次渲染時(shí)(當(dāng)輸入字段為空時(shí)),將渲染整個(gè)數(shù)組巢掺。當(dāng)用戶在字段中輸入值時(shí)句伶,filteredList將返回一個(gè)數(shù)組劲蜻,其中包含輸入到字段中的值。

使用計(jì)算屬性時(shí)考余,要計(jì)算的數(shù)據(jù)必須可用先嬉,否則將導(dǎo)致應(yīng)用程序出錯(cuò)

computed屬性創(chuàng)建了一個(gè)新的filteredlist屬性,這就是為什么我們可以在模板中引用它楚堤。每次依賴項(xiàng)執(zhí)行此操作時(shí)疫蔓,filteredlist的值都會(huì)更改。這里容易改變的依賴項(xiàng)是輸入值身冬。

最后衅胀,請(qǐng)注意,計(jì)算屬性允許我們?cè)谀0逯袆?chuàng)建一個(gè)變量酥筝,該變量是由一個(gè)或多個(gè)數(shù)據(jù)屬性構(gòu)建的滚躯。一個(gè)常見的例子是從這樣一個(gè)用戶的名字和姓氏創(chuàng)建一個(gè)全名:

computed: {
  fullName() {
    return `${this.firstName} ${this.lastName}`
  }
}

在模板中,您可以執(zhí)行全名嘿歌。每當(dāng)名字或姓氏的值更改時(shí)掸掏,全名的值將更改。

Watchers
Watchers對(duì)于希望響應(yīng)已發(fā)生的更改(例如宙帝,屬性或數(shù)據(jù)屬性)執(zhí)行操作的情況非常有用丧凤。正如Vue文檔所提到的,當(dāng)您想要執(zhí)行異步或昂貴的操作以響應(yīng)不斷變化的數(shù)據(jù)時(shí)茄唐,這是最有用的息裸。

在搜索示例中,我們可以返回到方法示例沪编,并為輸入數(shù)據(jù)屬性設(shè)置一個(gè)觀察程序呼盆。然后我們可以對(duì)輸入值的任何變化作出反應(yīng)。

首先蚁廓,讓我們恢復(fù)模板以使用語言數(shù)據(jù)屬性:

<div id="app">
  <h2>Language Search</h2>

  <div class="form-group">
    <input
      type="text"
      v-model="input"
      placeholder="Enter language"
      class="form-control"
    />
  </div>

  <ul v-for="(item, index) in languages" class="list-group">
    <li class="list-group-item" :key="item">{{ item }}</li>
  </ul>
</div>

然后我們的Vue實(shí)例將如下所示:

new Vue({
  el: "#app",
  data() {
    return {
      input: '',
      languages: []
    }
  },
  watch: {
    input: {
      handler() {
        this.languages = [
          'JavaScript',
          'Ruby',
          'Scala',
          'Python',
          'Java',
          'Kotlin',
          'Elixir'
        ].filter(item => item.toLowerCase().includes(this.input.toLowerCase()))
      },
      immediate: true
    }
  }
})

這里访圃,我將觀察者設(shè)置為一個(gè)對(duì)象(而不是一個(gè)函數(shù))。這是為了我可以指定一個(gè)即時(shí)屬性相嵌,它將導(dǎo)致觀察程序在組件被裝載后立即觸發(fā)腿时。這會(huì)產(chǎn)生填充列表的效果。然后運(yùn)行的函數(shù)在handler屬性中饭宾。

總結(jié):
正如他們所說批糟,擁有強(qiáng)大的力量,責(zé)任重大看铆。Vue為您提供了構(gòu)建偉大應(yīng)用程序所需的超級(jí)能力徽鼎。知道何時(shí)使用它們是構(gòu)建用戶喜愛的內(nèi)容的關(guān)鍵。方法、計(jì)算屬性和觀察者是您可用的超級(jí)能力的一部分否淤。往前走悄但,一定要好好利用它們!

原文地址:https://www.sitepoint.com/the-difference-between-computed-properties-methods-and-watchers-in-vue/添加鏈接描述

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末石抡,一起剝皮案震驚了整個(gè)濱河市檐嚣,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啰扛,老刑警劉巖嚎京,帶你破解...
    沈念sama閱讀 212,454評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異隐解,居然都是意外死亡挖藏,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,553評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門厢漩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人岩臣,你說我怎么就攤上這事溜嗜。” “怎么了架谎?”我有些...
    開封第一講書人閱讀 157,921評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵炸宵,是天一觀的道長。 經(jīng)常有香客問我谷扣,道長土全,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,648評(píng)論 1 284
  • 正文 為了忘掉前任会涎,我火速辦了婚禮裹匙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘末秃。我一直安慰自己概页,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,770評(píng)論 6 386
  • 文/花漫 我一把揭開白布练慕。 她就那樣靜靜地躺著惰匙,像睡著了一般。 火紅的嫁衣襯著肌膚如雪铃将。 梳的紋絲不亂的頭發(fā)上项鬼,一...
    開封第一講書人閱讀 49,950評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音劲阎,去河邊找鬼绘盟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的奥此。 我是一名探鬼主播弧哎,決...
    沈念sama閱讀 39,090評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼稚虎!你這毒婦竟也來了撤嫩?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,817評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤蠢终,失蹤者是張志新(化名)和其女友劉穎序攘,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寻拂,經(jīng)...
    沈念sama閱讀 44,275評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡程奠,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,592評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了祭钉。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞄沙。...
    茶點(diǎn)故事閱讀 38,724評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖慌核,靈堂內(nèi)的尸體忽然破棺而出距境,到底是詐尸還是另有隱情,我是刑警寧澤垮卓,帶...
    沈念sama閱讀 34,409評(píng)論 4 333
  • 正文 年R本政府宣布垫桂,位于F島的核電站,受9級(jí)特大地震影響粟按,放射性物質(zhì)發(fā)生泄漏诬滩。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,052評(píng)論 3 316
  • 文/蒙蒙 一灭将、第九天 我趴在偏房一處隱蔽的房頂上張望疼鸟。 院中可真熱鬧,春花似錦庙曙、人聲如沸愚臀。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,815評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽姑裂。三九已至,卻和暖如春男旗,著一層夾襖步出監(jiān)牢的瞬間舶斧,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,043評(píng)論 1 266
  • 我被黑心中介騙來泰國打工察皇, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留茴厉,地道東北人泽台。 一個(gè)月前我還...
    沈念sama閱讀 46,503評(píng)論 2 361
  • 正文 我出身青樓,卻偏偏與公主長得像矾缓,于是被迫代替她去往敵國和親怀酷。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,627評(píng)論 2 350

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

  • …多少人都說怎麼愛自己嗜闻? 去試問問自己蜕依? 你有好好的活著嗎…? 想死又不敢死琉雳, 想活又不好好的活样眠。 你容許自己一切...
    張錦輝閱讀 183評(píng)論 2 3
  • 《早寒江上有懷》 孟浩然 木落雁南度,北風(fēng)江上寒翠肘。 我家襄水曲檐束,遙隔楚云端。 鄉(xiāng)淚客中盡束倍,孤帆天際看被丧。 迷津欲有問...
    小小小小火閱讀 411評(píng)論 0 2
  • 一早聽見窗外的風(fēng)感覺冬天到了,周末一天沒有出門绪妹,車被老公開去晚碾,犯懶病的我懶得要命,沒有車感覺哪也去不了喂急,中午兒子在...
    李宇航媽媽閱讀 236評(píng)論 0 2
  • 這是莫凡來到人間的第九百五十年,他在等一個(gè)姑娘笛求,佛說廊移,他們會(huì)在千年已滿的那天重逢。為此探入,莫凡已經(jīng)走過了九百多年的春...
    夢(mèng)王洛閱讀 307評(píng)論 0 0