亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 編程 > JavaScript > 正文

簡單實現vue中的依賴收集與響應的方法

2019-11-19 12:07:17
字體:
來源:轉載
供稿:網友

開始

聲明一個對象man,可以視為vue中的data

let man = { height: 180, weight: 70, wealth: 100000000}

添加Observer

作用在于將參數對象的屬性變為響應式,只要對象的屬性被讀取或者被修改都能觀察到。然后新建一個Observer實例,將man作為參數扔進去。這里的proxyData是將man的屬性代理到以man為參數的Observer實例上去。

class Observer { constructor(obj) {  this.walk(obj) } walk(obj) {  Object.keys(obj).forEach(prop => {   this[prop] = obj[prop]   this.proxyData(obj, prop)   this.defineReactive(this, prop, obj[prop])     }) } proxyData(obj, prop) {  let _this = this  Object.defineProperty(obj, prop, {   get() {    return _this[prop]   },   set(newVal) {    _this[prop] = newVal   }  }) } defineReactive(obj, prop, val) {  Object.defineProperty(obj, prop, {   get() {    console.log(`${prop} - 被讀?。)    return val   },   set(newVal) {    if (newVal == val) return    val = newVal    console.log(`${prop} - 被修改!`)   }  }) }}new Observer(man)

這時打印一下man


現在man的屬性都是由Observer實例所對應的屬性的getter來返回,只有在查看時會被觸發


對man的屬性進行修改也會觸發實例對應屬性的setter

添加Watcher

現在的Watcher有點像vue中的computed,實際上就是定義一個計算屬性,這個計算屬性依賴于前面man中的某些屬性,由他們計算而得。

class Watcher { constructor(obj, prop, computed) {  this.getVal(obj, prop, computed) } getVal(obj, prop, computed) {  Object.defineProperty(obj, prop, {   get() {    console.log(`computed屬性 - ${prop}被讀??!`)    return computed()   },   set() {    console.error('計算屬性不可被修改!')   }  }) }}new Watcher(man, 'strength', () => { let {height, weight} = man if (height > 160 && weight > 70) return 'strong' return 'weak'})


看起來沒什么問題,所依賴的屬性如果變了,計算屬性只要再被查看(get方法)一次就可以更新了。但vue中的視圖渲染是實時的,視圖層依賴于數據層,數據變化了,視圖層也會跟著變化,不需要手動更新。類比到這個例子就是計算屬性如何才能在其所依賴的屬性發生變化時被通知從而觸發應有的事件?

這時我們先給Watcher加多一個callback,用于處理當依賴的數據被修改時,我這個計算屬性該怎么響應

比如當依賴被修改時,我們就把這個計算屬性的值打印出來

class Watcher { constructor(obj, prop, computed, callback) {  this.getVal(obj, prop, computed, callback) }new Watcher(man, 'strength', () => { let {height, weight} = man if (height > 160 && weight > 70) return 'strong' return 'weak'}, () => { console.log(`i am so ${man.strength} !`)})

一切都準備好了,接下來就是該如何實現?

我們先看下Watcher中getVal這個方法

getVal(obj, prop, computed, callback) { Object.defineProperty(obj, prop, {  get() {   console.log(`computed屬性 - ${prop}被讀取!`)   return computed()  },  set() {   console.error('計算屬性不可被修改!')  } })}

當我們查看計算屬性時,會調用computed這個方法,相當于查看了其所依賴的height和weight屬性,而在上面我們已經讓man的所有屬性都擁有了get方法,即他們被查看時我們是不是可以把callback塞給他們?
這時候我們引進一個橋梁,來連接Watcher和Observer。

添加Dep

Dep的用處在于當某一個屬性(以下稱‘自己')被依賴了,將依賴自己的粉絲(們)--也就是Watcher(s),收集起來,假如自己發生了變化,能夠及時通知粉絲們。

class Dep { constructor() {  this.deps = [] } getDeps() {  if (!Dep.target || this.deps.includes(Dep.target)) return  console.log('依賴添加', Dep.target)  this.deps.push(Dep.target) } notify() {  this.deps.forEach(dep => {   dep()  }) }}

這里的Dep.target就是前面所說的callback方法了。這時我們改一下Watcher中的getVal

getVal(obj, prop, computed, callback) { Object.defineProperty(obj, prop, {  get() {   Dep.target = callback   console.log(`computed屬性 - ${prop}被讀取!`)   return computed()  },  set() {   console.error('計算屬性不可被修改!')  } })}

在計算屬性被查看時,將callback賦值給Dep.target,接下來就會調用其所依賴屬性的getter,我們只要在getter里把callback給收集起來就行了。接下來修改依賴屬性的getter方法。

defineReactive(obj, prop, val) { let dep = new Dep() Object.defineProperty(obj, prop, {  get() {   console.log(`${prop} - 被讀??!`)   dep.getDeps() // 依賴收集   return val  },  set(newVal) {   if (newVal == val) return   val = newVal   console.log(`${prop} - 被修改!`)      } })}

這時watcher的callback都被依賴屬性給收集起來了,當依賴屬性發生變化時只要去運行這些callback就可以了。接下來就是修改依賴屬性的setter方法。

defineReactive(obj, prop, val) { let dep = new Dep() Object.defineProperty(obj, prop, {  get() {   console.log(`${prop} - 被讀?。)   dep.getDeps()   return val  },  set(newVal) {   if (newVal == val) return   val = newVal   console.log(`${prop} - 被修改!`)   dep.notify() // 運行所有callback  } })}

運行看看


我們加多一個Watcher試試

new Watcher(man, 'isGreat', () => { let {height, weight, wealth} = man if (height > 180 && weight > 70 && wealth > 100000) return 'Great!' return 'not good enough ...'}, () => { console.log(`they say i am ${man.isGreat}`)})


這就是vue中的一個依賴對應多個Watcher

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持武林網。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
97超级碰碰碰久久久| 国产精品在线看| 日韩在线欧美在线国产在线| 久久久久国产精品一区| 欧美在线亚洲在线| 亚洲精品视频免费| 亚洲天堂av电影| 久久成人人人人精品欧| 欧美大片va欧美在线播放| 中文字幕久久久av一区| 国产精品99久久久久久久久| 欧美成人免费va影院高清| 亚洲在线免费观看| 欧美成人精品三级在线观看| 国产99久久精品一区二区 夜夜躁日日躁| 久久精彩免费视频| 热久久视久久精品18亚洲精品| 欧美日韩精品国产| 永久免费精品影视网站| 黄色成人av网| 97视频在线看| 国产亚洲精品久久久久久777| 久久综合亚洲社区| 日本一区二区在线播放| 国内外成人免费激情在线视频网站| 69av成年福利视频| 欧美电影院免费观看| 岛国av一区二区| 精品久久久久国产| 欧美一级bbbbb性bbbb喷潮片| 久久琪琪电影院| 精品在线观看国产| 欧美巨大黑人极品精男| 在线性视频日韩欧美| 中文字幕日韩精品在线观看| 欧美多人爱爱视频网站| 欧美亚洲视频在线观看| 日韩精品视频在线播放| 国产成人在线视频| 伊人久久久久久久久久久久久| 夜夜嗨av一区二区三区免费区| 日韩欧美在线视频日韩欧美在线视频| 欧美精品在线观看91| 欧美一级黑人aaaaaaa做受| 国产丝袜一区视频在线观看| 久久香蕉频线观| 欧美成人免费网| 国产精品久久久| 国产精欧美一区二区三区| 欧美黄色片免费观看| 久久99久国产精品黄毛片入口| 日韩精品在线观看视频| 国产极品精品在线观看| 国产精品丝袜一区二区三区| 欧美第一黄网免费网站| 日韩精品视频免费在线观看| 国产成人精品视频在线| 亚洲免费高清视频| 亚洲精品福利在线观看| 国产激情综合五月久久| 91人人爽人人爽人人精88v| 91久久精品视频| 亚洲激情在线观看视频免费| 最近2019年好看中文字幕视频| 亚洲精品色婷婷福利天堂| 91av在线免费观看| 97成人精品区在线播放| 91伊人影院在线播放| 欧美日韩亚洲视频一区| 国产精品久久久久久久天堂| 久久伊人精品天天| 成人国产精品免费视频| 91欧美精品午夜性色福利在线| 久久精品电影网| 亚洲色图15p| 欧美激情一二三| 在线播放日韩av| 成人免费看黄网站| 这里只有视频精品| 北条麻妃99精品青青久久| 亚洲无亚洲人成网站77777| 成人在线观看视频网站| 欧美最顶级丰满的aⅴ艳星| 亚洲欧美中文日韩在线| 这里只有精品视频在线| 欧美午夜片在线免费观看| 亚洲第一天堂无码专区| 亚洲一区二区三区xxx视频| 欧美高清视频一区二区| 亚洲欧美在线免费| 亚洲一区二区三区乱码aⅴ| 亚洲精品国产综合区久久久久久久| 国内久久久精品| 精品一区二区电影| 成人激情电影一区二区| 日韩一区二区福利| 国产精品综合久久久| 1769国内精品视频在线播放| 久久精品视频99| 久久精品国产亚洲7777| 国产精品亚发布| 色中色综合影院手机版在线观看| 欧美成aaa人片在线观看蜜臀| 欧美精品成人在线| 亚洲欧洲国产一区| 久久人91精品久久久久久不卡| 91av视频在线| 日韩日本欧美亚洲| 欧美激情一级欧美精品| 亚洲伊人久久大香线蕉av| 91精品在线看| 欧美性生交大片免网| 日韩在线视频国产| 亚洲精品不卡在线| 中日韩午夜理伦电影免费| 亚洲在线免费观看| 日韩av手机在线| 亚洲欧美激情一区| 日日噜噜噜夜夜爽亚洲精品| 精品国产成人在线| 国产成+人+综合+亚洲欧美丁香花| 久久久久国产视频| 成人黄色av网| 亚洲欧美国产制服动漫| 97av在线播放| 亚洲裸体xxxx| 欧美福利在线观看| 成人乱色短篇合集| 精品国产一区二区三区久久狼黑人| 午夜精品国产精品大乳美女| 国产日韩欧美中文在线播放| 国产亚洲一级高清| 久久精品国产欧美激情| 国产啪精品视频网站| 91精品在线看| 久久综合电影一区| 欧美激情精品久久久久久变态| 欧美在线免费视频| 久久久久久美女| 久久精品免费播放| 上原亚衣av一区二区三区| 亚洲无亚洲人成网站77777| 欧美日韩成人黄色| 中文国产亚洲喷潮| 日韩高清中文字幕| 精品综合久久久久久97| 这里只有精品在线播放| 国产精品v片在线观看不卡| 日韩高清免费在线| 亚洲精品丝袜日韩| 91沈先生作品| 中文字幕国产精品久久| 亚洲色图综合久久| 国产精品网红福利| 黑人欧美xxxx| 国产欧美日韩免费看aⅴ视频| 日韩经典第一页| 激情成人在线视频| 欧美视频在线观看免费网址| 成人福利视频在线观看| 77777少妇光屁股久久一区| 91在线视频导航| 国产一区二区在线免费视频| 午夜精品三级视频福利|