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

用Vue.js實(shí)現(xiàn)監(jiān)聽屬性的變化

 更新時(shí)間:2016年11月17日 11:42:27   投稿:daisy  
響應(yīng)系統(tǒng)是Vue.js的一個(gè)顯著功能,修改屬性,可以更新視圖,這讓狀態(tài)管理變得非常簡(jiǎn)單且直觀。這篇文章主要給大家介紹如何利用Vue.js實(shí)現(xiàn)觀察屬性的變化,有需要的朋友們可以參考借鑒,感興趣的朋友們下面來(lái)一起看看吧。

前言

創(chuàng)建 Vue 實(shí)例時(shí),Vue 將遍歷 data 的屬性,通過 ES5 的 Object.defineProperty 將它們轉(zhuǎn)為 getter/setter,在其內(nèi)部 Vue 可以追蹤依賴、通知變化。

const vm = new Vue({
 data: {foo: 1} // 'vm.foo' (在內(nèi)部,同 'this.foo') 是響應(yīng)的
})

觀察屬性變化

Vue 的實(shí)例提供了 $watch 方法,用于觀察屬性變化。

const vm = new Vue({
 data: {foo: 1}
})

vm.$watch('foo', function (newValue, oldValue) {
 console.log(newValue, oldValue) // 輸出 2 1
 console.log(this.foo) // 輸出 2
})

vm.foo = 2

當(dāng)屬性變化后,響應(yīng)函數(shù)將會(huì)被調(diào)用,在其內(nèi)部,this 自動(dòng)綁定到 Vue 的實(shí)例 vm 上。

需要注意的是,響應(yīng)是異步的。

如下:

const vm = new Vue({
 data: {foo: 1}
})

vm.$watch('foo', function (newValue, oldValue) {
 console.log('inner:', newValue) // 后輸出 "inner" 2
})

vm.foo = 2
console.log('outer:', vm.foo) // 先輸出 "outer" 2

通過 $watch Vue 實(shí)現(xiàn)了數(shù)據(jù)和視圖的綁定。觀察到數(shù)據(jù)變化,Vue 便異步更新 DOM ,在同一事件循環(huán)內(nèi),多次數(shù)據(jù)變化將會(huì)被緩存起來(lái),在下次事件循環(huán)中,Vue 刷新隊(duì)列并僅執(zhí)行必要的更新。

如下:

const vm = new Vue({
 data: {foo: 1}
})

vm.$watch('foo', function (newValue, oldValue) {
 console.log('inner:', newValue) // 后只輸出一次 "inner" 5
})

vm.foo = 2
vm.foo = 3
vm.foo = 4
console.log('outer:', vm.foo) // 先輸出 "outer" 4
vm.foo = 5

計(jì)算屬性

MV* 中,將 Model 層數(shù)據(jù)展現(xiàn)到 View,經(jīng)常有復(fù)雜的數(shù)據(jù)處理邏輯,這種情況下,使用計(jì)算屬性 (computed property) 更加明智。

const vm = new Vue({
 data: {
 width: 0,
 height: 0,
 },
 computed: {
 area () {
  let output = ''
  if (this.width > 0 && this.height > 0) {
  const area = this.width * this.height
  output = area.toFixed(2) + 'm²'
  }
  return output
 }
 }
})

vm.width = 2.34
vm.height = 5.67
console.log(vm.area) // 輸出 "13.27m²"

在計(jì)算屬性內(nèi)部,this 自動(dòng)綁定 vm,因此聲明計(jì)算屬性時(shí)需要避免使用箭頭函數(shù)。

上例中,vm.widthvm.height 是響應(yīng)的,vm.area 內(nèi)部首次讀取 this.width this.height 時(shí),Vue 收集其做為 vm.area 的依賴,此后 vm.width vm.height 變化時(shí),vm.area 重新求值。計(jì)算屬性是基于它的依賴緩存,如果 vm.width vm.height 沒有變化,多次讀取 vm.area,會(huì)立即返回之前的計(jì)算結(jié)果,而不必再次求值。

同樣由于 vm.widthvm.height 是響應(yīng)的,在 vm.area 中可以將依賴的屬性賦值給一個(gè)變量,通過讀取變量來(lái)減少讀取屬性次數(shù),同時(shí)解決在條件分支中,Vue 有時(shí)會(huì)無(wú)法收集到依賴的問題。

實(shí)現(xiàn)如下:

const vm = new Vue({
 data: {
 width: 0,
 height: 0,
 },
 computed: {
 area () {
  let output = ''
  const {width, height} = this
  if (width > 0 && height > 0) {
  const area = width * height
  output = area.toFixed(2) + 'm²'
  }
  return output
 }
 }
})

vm.width = 2.34
vm.height = 5.67
console.log(vm.area) // 輸出 "13.27m²"

通過 ob.js 單獨(dú)使用 Vue 的屬性觀察模塊

為方便學(xué)習(xí)和使用,ob.js 將 Vue 中屬性觀察模塊提取并封裝了一下。

ob.js GitHub 地址:https://github.com/cnlon/ob.js

安裝

npm install --save ob.js

觀察屬性變化

const target = {a: 1}
ob(target, 'a', function (newValue, oldValue) {
 console.log(newValue, oldValue) // 3 1
})
target.a = 3

添加計(jì)算屬性

const target = {a: 1}
ob.compute(target, 'b', function () {
 return this.a * 2
})
target.a = 10
console.log(target.b) // 20

像聲明 Vue 實(shí)例一樣傳入?yún)?shù)集合

const options = {
 data: {
 PI: Math.PI,
 radius: 1,
 },
 computed: {
 'area': function () {
  return this.PI * this.square(this.radius)
 },
 },
 watchers: {
 'area': function (newValue, oldValue) {
  console.log(newValue) // 28.274333882308138
 },
 },
 methods: {
 square (num) {
  return num * num
 },
 },
}
const target = ob.react(options)
target.radius = 3

總結(jié)

以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問大家可以留言交流。

相關(guān)文章

  • 詳解Vue使用命令行搭建單頁(yè)面應(yīng)用

    詳解Vue使用命令行搭建單頁(yè)面應(yīng)用

    本篇文章主要介紹了詳解Vue使用命令行搭建單頁(yè)面應(yīng)用,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來(lái)看看吧
    2017-05-05
  • JS圖片懶加載庫(kù)VueLazyLoad詳解

    JS圖片懶加載庫(kù)VueLazyLoad詳解

    這篇文章主要為大家介紹了JS圖片懶加載庫(kù)VueLazyLoad示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-02-02
  • 原生JS實(shí)現(xiàn)Vue transition fade過渡動(dòng)畫效果示例

    原生JS實(shí)現(xiàn)Vue transition fade過渡動(dòng)畫效果示例

    這篇文章主要為大家介紹了原生JS實(shí)現(xiàn)Vue transition fade過渡動(dòng)畫效果示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-06-06
  • Vue?Baidu?Map之自定義點(diǎn)圖標(biāo)bm-marker的示例

    Vue?Baidu?Map之自定義點(diǎn)圖標(biāo)bm-marker的示例

    這篇文章主要介紹了Vue?Baidu?Map之自定義點(diǎn)圖標(biāo)bm-marker,文中給大家介紹了vue-baidu-api地圖標(biāo)記點(diǎn)(自定義標(biāo)記圖標(biāo)),設(shè)置標(biāo)記點(diǎn)的優(yōu)先級(jí)問題,結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2023-08-08
  • vue路由守衛(wèi)+登錄態(tài)管理實(shí)例分析

    vue路由守衛(wèi)+登錄態(tài)管理實(shí)例分析

    這篇文章主要介紹了vue路由守衛(wèi)+登錄態(tài)管理,結(jié)合實(shí)例形式分析了vue路由守衛(wèi)與登錄態(tài)管理相關(guān)操作步驟與實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2019-05-05
  • vue2實(shí)現(xiàn)搜索結(jié)果中的搜索關(guān)鍵字高亮的代碼

    vue2實(shí)現(xiàn)搜索結(jié)果中的搜索關(guān)鍵字高亮的代碼

    這篇文章主要介紹了vue2實(shí)現(xiàn)搜索結(jié)果中的搜索關(guān)鍵字高亮的代碼,需要的朋友可以參考下
    2018-08-08
  • 詳解VUE中的Proxy代理

    詳解VUE中的Proxy代理

    這篇文章主要介紹了Proxy代理對(duì)象詳解,Proxy 是ES6中提供的一個(gè)非常強(qiáng)大的功能,可以用來(lái)代理另一個(gè)對(duì)象,從而攔截、監(jiān)視并修改這個(gè)對(duì)象的各種操作,需要的朋友可以參考下
    2023-04-04
  • Vuex之理解Store的用法

    Vuex之理解Store的用法

    本篇文章主要介紹了Vuex之理解Store的用法,Store類就是存儲(chǔ)數(shù)據(jù)和管理數(shù)據(jù)方法的倉(cāng)庫(kù),實(shí)現(xiàn)方式是將數(shù)據(jù)和方法已對(duì)象形式傳入其實(shí)例中
    2017-04-04
  • vue如何使用bable將es6轉(zhuǎn)譯為es5

    vue如何使用bable將es6轉(zhuǎn)譯為es5

    這篇文章主要介紹了vue如何使用bable將es6轉(zhuǎn)譯為es5問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2023-07-07
  • Vue 2源碼解析Parse函數(shù)定義

    Vue 2源碼解析Parse函數(shù)定義

    這篇文章主要為大家介紹了Vue 2源碼解析Parse函數(shù)定義,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-08-08

最新評(píng)論

福海县| 禹州市| 周宁县| 寻乌县| 新化县| 郴州市| 江都市| 永城市| 吴桥县| 齐河县| 惠安县| 临湘市| 丰城市| 昂仁县| 健康| 湘阴县| 涿州市| 塔城市| 新晃| 楚雄市| 响水县| 琼中| 漳平市| 岚皋县| 高安市| 澄江县| 宝兴县| 开阳县| 高阳县| 霍城县| 新和县| 凌源市| 江阴市| 彝良县| 日喀则市| 旌德县| 怀远县| 云霄县| 金门县| 咸丰县| 甘孜县|