溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Vue中computed、methods、watch三者的區(qū)別是什么

發(fā)布時(shí)間:2021-01-28 10:05:49 來源:億速云 閱讀:166 作者:Leah 欄目:web開發(fā)

本篇文章為大家展示了Vue中computed、methods、watch三者的區(qū)別是什么,內(nèi)容簡(jiǎn)明扼要并且容易理解,絕對(duì)能使你眼前一亮,通過這篇文章的詳細(xì)介紹希望你能有所收獲。

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">
 <h3>Language Search</h3>

 <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">
 <h3>Language Search</h3>

 <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">
 <h3>Language Search</h3>

 <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屬性中。

上述內(nèi)容就是Vue中computed、methods、watch三者的區(qū)別是什么,你們學(xué)到知識(shí)或技能了嗎?如果還想學(xué)到更多技能或者豐富自己的知識(shí)儲(chǔ)備,歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI