国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

用 Vue 來觀察屬性變化

hot_pot_Leo / 1953人閱讀

摘要:創(chuàng)建實(shí)例時(shí),將遍歷的屬性,通過的將它們轉(zhuǎn)為,在其內(nèi)部可以追蹤依賴通知變化。在內(nèi)部,同是響應(yīng)的觀察屬性變化的實(shí)例提供了方法,用于觀察屬性變化。

響應(yīng)系統(tǒng)是 Vue 一個(gè)顯著功能,修改屬性,可以更新視圖,這讓狀態(tà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ì)被緩存起來,在下次事件循環(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) + "m2"
      }
      return output
    }
  }
})

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

在計(jì)算屬性內(nèi)部,this 自動(dòng)綁定 vm,因此聲明計(jì)算屬性時(shí)需要避免使用箭頭函數(shù)
上例中,vm.widthvm.height 是響應(yīng)的,vm.area 內(nèi)部首次讀取 this.widththis.height 時(shí),Vue 收集其做為 vm.area 的依賴,此后 vm.widthvm.height 變化時(shí),vm.area 重新求值。
計(jì)算屬性是基于它的依賴緩存,如果 vm.widthvm.height 沒有變化,多次讀取 vm.area,會(huì)立即返回之前的計(jì)算結(jié)果,而不必再次求值。
同樣由于 vm.widthvm.height 是響應(yīng)的,在 vm.area 中可以將依賴的屬性賦值給一個(gè)變量,通過讀取變量來減少讀取屬性次數(shù),同時(shí)解決在條件分支中,Vue 有時(shí)會(huì)無法收集到依賴的問題
新的實(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) + "m2"
      }
      return output
    }
  }
})

vm.width = 2.34
vm.height = 5.67
console.log(vm.area) // 輸出 "13.27m2"
通過 ob.js smart-observe 多帶帶使用 Vue 的屬性觀察模塊

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

smart-observe GitHub 地址:https://github.com/cnlon/smar...

安裝

npm install --save smart-observe

觀察屬性變化

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

添加計(jì)算屬性

const target = {a: 1}
observe.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 = observe.react(options)
target.radius = 3

更詳細(xì)的使用介紹請 點(diǎn)擊這里

同時(shí)推薦其它兩款同類庫

Watch.JS https://github.com/melanke/Wa...

observe.js https://github.com/kmdjs/obse...

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/80894.html

相關(guān)文章

  • 深入淺出Vue響應(yīng)式原理

    摘要:總結(jié)最后我們依照下圖參考深入淺出,再來回顧下整個(gè)過程在后,會(huì)調(diào)用函數(shù)進(jìn)行初始化,也就是過程,在這個(gè)過程通過轉(zhuǎn)換成了的形式,來對數(shù)據(jù)追蹤變化,當(dāng)被設(shè)置的對象被讀取的時(shí)候會(huì)執(zhí)行函數(shù),而在當(dāng)被賦值的時(shí)候會(huì)執(zhí)行函數(shù)。 前言 Vue 最獨(dú)特的特性之一,是其非侵入性的響應(yīng)式系統(tǒng)。數(shù)據(jù)模型僅僅是普通的 JavaScript 對象。而當(dāng)你修改它們時(shí),視圖會(huì)進(jìn)行更新。這使得狀態(tài)管理非常簡單直接,不過理解...

    yiliang 評論0 收藏0
  • Vue中如何使方法、計(jì)算屬性觀察

    摘要:如何實(shí)現(xiàn)一個(gè)查看在線在中我們放置了一些事件處理方法,我們可以在事件綁定中直接應(yīng)用,不會(huì)依賴于任何的屬性。例如計(jì)算屬性依賴于屬性,只要屬性發(fā)生變化,我們的也會(huì)發(fā)生變化,從而篩選出我們需要的數(shù)據(jù)。 熟悉 Vue 的都知道 方法methods、計(jì)算屬性computed、觀察者watcher 在 Vue 中有著非常重要的作用,有些時(shí)候我們實(shí)現(xiàn)一個(gè)功能的時(shí)候可以使用它們中任何一個(gè)都是可以的,但是...

    zhaot 評論0 收藏0
  • 淺談Vue中計(jì)算屬性computed的實(shí)現(xiàn)原理

    摘要:雖然計(jì)算屬性在大多數(shù)情況下更合適,但有時(shí)也需要一個(gè)自定義的偵聽器。當(dāng)某個(gè)屬性發(fā)生變化,觸發(fā)攔截函數(shù),然后調(diào)用自身消息訂閱器的方法,遍歷當(dāng)前中保存著所有訂閱者的數(shù)組,并逐個(gè)調(diào)用的方法,完成響應(yīng)更新。 雖然目前的技術(shù)棧已由Vue轉(zhuǎn)到了React,但從之前使用Vue開發(fā)的多個(gè)項(xiàng)目實(shí)際經(jīng)歷來看還是非常愉悅的,Vue文檔清晰規(guī)范,api設(shè)計(jì)簡潔高效,對前端開發(fā)人員友好,上手快,甚至個(gè)人認(rèn)為在很多...

    laznrbfe 評論0 收藏0
  • 做面試的不倒翁:淺談 Vue 中 computed 實(shí)現(xiàn)原理

    摘要:當(dāng)某個(gè)屬性發(fā)生變化,觸發(fā)攔截函數(shù),然后調(diào)用自身消息訂閱器的方法,遍歷當(dāng)前中保存著所有訂閱者的數(shù)組,并逐個(gè)調(diào)用的方法,完成響應(yīng)更新。 編者按:我們會(huì)不時(shí)邀請工程師談?wù)動(dòng)幸馑嫉募夹g(shù)細(xì)節(jié),希望知其所以然能讓大家在面試有更出色表現(xiàn)。也給面試官提供更多思路。 showImg(https://segmentfault.com/img/bVbgYyU?w=1200&h=600); 雖然目前的技術(shù)...

    Anonymous1 評論0 收藏0
  • 關(guān)于框架

    摘要:事件訂閱發(fā)布者模式什么是讀音類似于是一套構(gòu)建用戶界面的漸進(jìn)式框架。與其他重量級(jí)框架不同的是,采用自底向上增量開發(fā)的設(shè)計(jì)。 MVC && MVVM 前端框架前端 MV*框架的意義 被誤解的MVC和被神化的MVVM Vue.js新手入門指南 單頁應(yīng)用SPA的路由 單頁面應(yīng)用的路由問題 本文是在自己總結(jié)時(shí),看了許多篇文章有了些體會(huì),然后把我認(rèn)為有意義的摘抄下來,文中很大部分摘錄以上...

    Richard_Gao 評論0 收藏0

發(fā)表評論

0條評論

最新活動(dòng)
閱讀需要支付1元查看
<