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

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

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

Vue偵聽器watch

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

<div id="watch-example">
<p>
Ask a yes/no question:
<input v-model="question">
</p>
<p>{{ answer }}</p>
</div>
<!-- 因為 AJAX 庫和通用工具的生態(tài)已經相當豐富,Vue 核心代碼沒有重復 -->
<!-- 提供這些功能以保持精簡。這也可以讓你自由選擇自己更熟悉的工具。 -->
<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ā)生改變,這個函數就會運行
question: function (newQuestion, oldQuestion) {
this.answer = 'Waiting for you to stop typing...'
this.getAnswer()
}
},
methods: {
// `_.debounce` 是一個通過 Lodash 限制操作頻率的函數。
// 在這個例子中,我們希望限制訪問 yesno.wtf/api 的頻率
// AJAX 請求直到用戶輸入完畢才會發(fā)出。想要了解更多關于
// `_.debounce` 函數 (及其近親 `_.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馆斎氲却暮撩霐?
500
)
}
})
</script>

偵聽器(watch)的高級用法

假設有如下代碼:

<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;
 }
 } 
})

上面的代碼的效果是,當我們輸入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
 }
 } 
})

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

默認情況下 handler 只監(jiān)聽obj這個屬性它的引用的變化,我們只有給obj賦值的時候它才會監(jiān)聽到,比如我們在 mounted事件鉤子函數中對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設置監(jiān)聽函數。

總結

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

相關文章

  • vue自定義底部導航欄Tabbar的實現代碼

    vue自定義底部導航欄Tabbar的實現代碼

    這篇文章主要介紹了vue自定義底部導航欄Tabbar的實現代碼,非常不錯,具有一定的參考借鑒價值,需要的朋友可以參考下
    2018-09-09
  • 關于vuejs中v-if和v-show的區(qū)別及v-show不起作用問題

    關于vuejs中v-if和v-show的區(qū)別及v-show不起作用問題

    v-if 有更高的切換開銷,而 v-show 有更高的出事渲染開銷.因此,如果需要非常頻繁的切換,那么使用v-show好一點;如果在運行時條件不太可能改變,則使用v-if 好點
    2018-03-03
  • Vue3中如何修改父組件傳遞到子組件中的值(全網少有!)

    Vue3中如何修改父組件傳遞到子組件中的值(全網少有!)

    大家都知道,vue是具有單向數據流的傳遞特性,下面這篇文章主要給大家介紹了關于Vue3中如何修改父組件傳遞到子組件中值的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下
    2023-04-04
  • vue實現購物車列表

    vue實現購物車列表

    這篇文章主要為大家詳細介紹了vue實現購物車列表,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-06-06
  • vue3實現無縫滾動組件的示例代碼

    vue3實現無縫滾動組件的示例代碼

    在日常開發(fā)中,經常遇到需要支持列表循環(huán)滾動展示,特別是在數據化大屏開發(fā)中,所以小編今天為大家介紹一下如何利用vue3實現一個無縫滾動組件吧
    2023-09-09
  • vue 限制input只能輸入正數的操作

    vue 限制input只能輸入正數的操作

    這篇文章主要介紹了vue 限制input只能輸入正數的操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-08-08
  • vue中使用iview自定義驗證關鍵詞輸入框問題及解決方法

    vue中使用iview自定義驗證關鍵詞輸入框問題及解決方法

    這篇文章主要介紹了vue中使用iview自定義驗證關鍵詞輸入框問題及解決方法,本文通過實例結合代碼的形式給大家介紹解決方法,需要的朋友可以參考下
    2018-03-03
  • Vue.js實現動畫與過渡效果的示例代碼

    Vue.js實現動畫與過渡效果的示例代碼

    在現代前端開發(fā)中,用戶體驗至關重要,一個精美的動畫過渡不僅能提升界面的美觀性,還能讓用戶在使用時感受到流暢的交互體驗,在本文中,我們將深入探討如何在 Vue.js 中實現動畫與過渡效果,并提供示例代碼,需要的朋友可以參考下
    2024-10-10
  • vue單頁面SEO優(yōu)化的實現

    vue單頁面SEO優(yōu)化的實現

    本文主要介紹了vue單頁面SEO優(yōu)化的實現,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2022-06-06
  • 關于el-tooltip使用\n換行的情況顯示

    關于el-tooltip使用\n換行的情況顯示

    這篇文章主要介紹了關于el-tooltip使用\n換行的情況顯示,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-04-04

最新評論

上饶县| 渝北区| 贡觉县| 舞钢市| 周口市| 富裕县| 晋中市| 喜德县| 瓮安县| 白河县| 九寨沟县| 宝兴县| 普格县| 南汇区| 安国市| 双峰县| 缙云县| 营口市| 枣阳市| 元朗区| 尤溪县| 南宁市| 崇义县| 苏尼特左旗| 册亨县| 绥芬河市| 山阳县| 格尔木市| 娱乐| 新乐市| 肥乡县| 塔城市| 恩施市| 北票市| 普洱| 罗平县| 禄丰县| 大竹县| 屯门区| 禹城市| 杂多县|