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

Vue.js中關(guān)于偵聽器(watch)的高級用法示例

 更新時間:2018年05月02日 11:53:39   作者:Dunizb  
Vue.js 提供了一個方法 watch,它用于觀察Vue實例上的數(shù)據(jù)變動。下面這篇文章主要給大家介紹了關(guān)于Vue.js中關(guān)于偵聽器(watch)的高級用法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下

Vue偵聽器watch

雖然計算屬性在大多數(shù)情況下更合適,但有時也需要一個自定義的偵聽器。這就是為什么 Vue 通過 watch 選項提供了一個更通用的方法,來響應(yīng)數(shù)據(jù)的變化。當(dāng)需要在數(shù)據(jù)變化時執(zhí)行異步或開銷較大的操作時,這個方式是最有用的。例如:

<div id="watch-example">
<p>
Ask a yes/no question:
<input v-model="question">
</p>
<p>{{ answer }}</p>
</div>
<!-- 因為 AJAX 庫和通用工具的生態(tài)已經(jīng)相當(dāng)豐富,Vue 核心代碼沒有重復(fù) -->
<!-- 提供這些功能以保持精簡。這也可以讓你自由選擇自己更熟悉的工具。 -->
<script src="https://cdn.jsdelivr.net/npm/axios@0.12.0/dist/axios.min.js"></script>
<script src="https://cdn.jsdelivr.net/npm/lodash@4.13.1/lodash.min.js"></script>
<script>
var watchExampleVM = new Vue({
el: '#watch-example',
data: {
question: '',
answer: 'I cannot give you an answer until you ask a question!'
},
watch: {
// 如果 `question` 發(fā)生改變,這個函數(shù)就會運行
question: function (newQuestion, oldQuestion) {
this.answer = 'Waiting for you to stop typing...'
this.getAnswer()
}
},
methods: {
// `_.debounce` 是一個通過 Lodash 限制操作頻率的函數(shù)。
// 在這個例子中,我們希望限制訪問 yesno.wtf/api 的頻率
// AJAX 請求直到用戶輸入完畢才會發(fā)出。想要了解更多關(guān)于
// `_.debounce` 函數(shù) (及其近親 `_.throttle`) 的知識,
// 請參考:https://lodash.com/docs#debounce
getAnswer: _.debounce(
function () {
if (this.question.indexOf('?') === -1) {
this.answer = 'Questions usually contain a question mark. ;-)'
return
}
this.answer = 'Thinking...'
var vm = this // this重定向
axios.get('https://yesno.wtf/api')
.then(function (response) {
vm.answer = _.capitalize(response.data.answer)
})
.catch(function (error) {
vm.answer = 'Error! Could not reach the API. ' + error
})
},
// 這是我們?yōu)榕卸ㄓ脩敉V馆斎氲却暮撩霐?shù)
500
)
}
})
</script>

偵聽器(watch)的高級用法

假設(shè)有如下代碼:

<div>
  <p>FullName: {{fullName}}</p>
  <p>FirstName: <input type="text" v-model="firstName"></p>
</div>
new Vue({
 el: '#root',
 data: {
 firstName: 'Dawei',
 lastName: 'Lou',
 fullName: ''
 },
 watch: {
 firstName(newName, oldName) {
  this.fullName = newName + ' ' + this.lastName;
 }
 } 
})

上面的代碼的效果是,當(dāng)我們輸入firstName后,wacth監(jiān)聽每次修改變化的新值,然后計算輸出fullName。

handler方法和immediate屬性

這里 watch 的一個特點是,最初綁定的時候是不會執(zhí)行的,要等到 firstName 改變時才執(zhí)行監(jiān)聽計算。那我們想要一開始就讓他最初綁定的時候就執(zhí)行改怎么辦呢?我們需要修改一下我們的 watch 寫法,修改過后的 watch 代碼如下:

watch: {
 firstName: {
 handler(newName, oldName) {
  this.fullName = newName + ' ' + this.lastName;
 },
 // 代表在wacth里聲明了firstName這個方法之后立即先去執(zhí)行handler方法
 immediate: true
 }
}

注意到handler了嗎,我們給 firstName 綁定了一個handler方法,之前我們寫的 watch 方法其實默認寫的就是這個handler,Vue.js會去處理這個邏輯,最終編譯出來其實就是這個handler。

而immediate:true代表如果在 wacth 里聲明了 firstName 之后,就會立即先去執(zhí)行里面的handler方法,如果為 false就跟我們以前的效果一樣,不會在綁定的時候就執(zhí)行。

deep屬性

watch 里面還有一個屬性 deep,默認值是 false,代表是否深度監(jiān)聽,比如我們 data 里有一個obj屬性:

<div>
  <p>obj.a: {{obj.a}}</p>
  <p>obj.a: <input type="text" v-model="obj.a"></p>
</div>
new Vue({
 el: '#root',
 data: {
 obj: {
  a: 123
 }
 },
 watch: {
 obj: {
  handler(newName, oldName) {
   console.log('obj.a changed');
  },
  immediate: true
 }
 } 
})

當(dāng)我們在在輸入框中輸入數(shù)據(jù)視圖改變obj.a的值時,我們發(fā)現(xiàn)是無效的。受現(xiàn)代 JavaScript 的限制 (以及廢棄 Object.observe),Vue 不能檢測到對象屬性的添加或刪除。由于 Vue 會在初始化實例時對屬性執(zhí)行 getter/setter 轉(zhuǎn)化過程,所以屬性必須在 data 對象上存在才能讓 Vue 轉(zhuǎn)換它,這樣才能讓它是響應(yīng)的。

默認情況下 handler 只監(jiān)聽obj這個屬性它的引用的變化,我們只有給obj賦值的時候它才會監(jiān)聽到,比如我們在 mounted事件鉤子函數(shù)中對obj進行重新賦值:

mounted: {
 this.obj = {
 a: '456'
 }
}

這樣我們的 handler 才會執(zhí)行,打印obj.a changed。

相反,如果我們需要監(jiān)聽obj里的屬性a的值呢?這時候deep屬性就派上用場了!

watch: {
 obj: {
 handler(newName, oldName) {
  console.log('obj.a changed');
 },
 immediate: true,
 deep: true
 }
}

deep的意思就是深入觀察,監(jiān)聽器會一層層的往下遍歷,給對象的所有屬性都加上這個監(jiān)聽器,但是這樣性能開銷就會非常大了,任何修改obj里面任何一個屬性都會觸發(fā)這個監(jiān)聽器里的 handler。

優(yōu)化,我們可以是使用字符串形式監(jiān)聽。

watch: {
 'obj.a': {
 handler(newName, oldName) {
  console.log('obj.a changed');
 },
 immediate: true,
 // deep: true
 }
}

這樣Vue.js才會一層一層解析下去,直到遇到屬性a,然后才給a設(shè)置監(jiān)聽函數(shù)。

總結(jié)

以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。

相關(guān)文章

  • 詳解利用eventemitter2實現(xiàn)Vue組件通信

    詳解利用eventemitter2實現(xiàn)Vue組件通信

    這篇文章主要介紹了詳解利用eventemitter2實現(xiàn)Vue組件通信,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-11-11
  • vue select組件的使用與禁用實現(xiàn)代碼

    vue select組件的使用與禁用實現(xiàn)代碼

    這篇文章主要介紹了vue--select組件的使用與禁用的實現(xiàn)代碼,非常不錯,具有參考借鑒價值 ,需要的朋友可以參考下
    2018-04-04
  • 一文帶你搞懂Vue3的基本語法

    一文帶你搞懂Vue3的基本語法

    這篇文章主要給大家詳細介紹一下Vue3中的基本語法,文中的示例代碼講解詳細,對我們學(xué)習(xí)Vue3有一定的幫助,感興趣的小伙伴可以了解一下
    2022-11-11
  • vue2封裝webSocket的實現(xiàn)(開箱即用)

    vue2封裝webSocket的實現(xiàn)(開箱即用)

    在Vue2中,可以使用WebSocket實時通信,本文主要介紹了vue2封裝webSocket的實現(xiàn),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-08-08
  • Vue2?響應(yīng)式系統(tǒng)之?dāng)?shù)組

    Vue2?響應(yīng)式系統(tǒng)之?dāng)?shù)組

    這篇文章主要介紹了Vue2?響應(yīng)式系統(tǒng)之?dāng)?shù)組,本文接著上幾篇文章Vue2響應(yīng)式系統(tǒng)?、Vue2?響應(yīng)式系統(tǒng)之分支切換,響應(yīng)式系統(tǒng)之嵌套、響應(yīng)式系統(tǒng)之深度響應(yīng)?展開相關(guān)內(nèi)容,需要的朋友可以參考一下
    2022-04-04
  • Vuex actions?異步操作方法詳解

    Vuex actions?異步操作方法詳解

    這篇文章主要介紹了Vuex actions?異步操作方法,需要的朋友可以參考下
    2023-10-10
  • 詳解如何搭建mpvue框架搭配vant組件庫的小程序項目

    詳解如何搭建mpvue框架搭配vant組件庫的小程序項目

    這篇文章主要介紹了詳解如何搭建mpvue框架搭配vant組件庫的小程序項目,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-05-05
  • 面試題:react和vue的區(qū)別分析

    面試題:react和vue的區(qū)別分析

    這篇文章主要介紹了react和vue的區(qū)別分析,在面試中經(jīng)常會遇到,小編通過實例文字相結(jié)合的形式給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-04-04
  • vue實現(xiàn)前端列表多條件篩選

    vue實現(xiàn)前端列表多條件篩選

    這篇文章主要為大家詳細介紹了vue實現(xiàn)前端列表多條件篩選,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-10-10
  • Vue實現(xiàn)Excel預(yù)覽功能使用場景示例詳解

    Vue實現(xiàn)Excel預(yù)覽功能使用場景示例詳解

    這篇文章主要為大家介紹了Vue實現(xiàn)Excel預(yù)覽功能使用場景示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-09-09

最新評論