Vue-數(shù)據(jù)響應(yīng)式

  • 一個(gè)物體能對(duì)外界的刺激作出反應(yīng),那他就是響應(yīng)式的
    1. const vm = new Vue({data:{n:0}})
    2. 我如果修改 vm.n ,那么UI中的 n 就回來(lái)響應(yīng)我
    3. Vue通過(guò)Object.defineProperty來(lái)實(shí)現(xiàn)數(shù)據(jù)響應(yīng)式
  • Vue通過(guò)Object.defineProperty的 getter/setter 對(duì)收集的依賴項(xiàng)進(jìn)行監(jiān)聽(tīng),在屬性被訪問(wèn)和修改時(shí)通知變化,進(jìn)而更新視圖數(shù)據(jù)

getter/setter

用于對(duì)屬性的讀寫(xiě)進(jìn)行監(jiān)控

getter

let obj1 = {
  姓: "高",
  名: "圓圓",
  姓名() {
    return this.姓 + this.名;
  },
  age: 18
};

console.log( obj1.姓名());
// 高圓圓
let obj2 = {
  姓: "高",
  名: "圓圓",
  get 姓名() {
    return this.姓 + this.名;
  },
  age: 18
};

console.log( obj2.姓名);
// 高圓圓
  • 對(duì)比代碼,發(fā)現(xiàn)只是在姓名函數(shù)處添加了 get ,最后使用的時(shí)候就不再需要加 ()
  • getter 就是這樣用的,不加括號(hào)的函數(shù)

setter

let obj3 = {
  姓: "高",
  名: "圓圓",
  get 姓名() {
    return this.姓 + this.名;
  },
  set 姓名(xxx){
    this.姓 = xxx[0]
    this.名 = xxx.slice(1)
  },
  age: 18
};

obj3.姓名 = '劉詩(shī)詩(shī)'

console.log(`姓 ${obj3.姓}睛低,名 ${obj3.名}`)
// 姓 劉,名 詩(shī)詩(shī) 
  • setter 就是這樣用的蹬敲,用 = xxx 觸發(fā) set 函數(shù)

Object.defineProperty

用于給對(duì)象添加新屬性暇昂,也可以給對(duì)象添加 getter/setter

let obj = {}

Object.defineProperty(obj, 'x', {value: 1})

Object.defineProperty(obj, 'y', {
  get(){...}
  set(value){...}
})

監(jiān)聽(tīng)與代理

  • 對(duì) myData 對(duì)象的屬性讀寫(xiě),全權(quán)由另一個(gè)對(duì)象 vm 負(fù)責(zé)
  • 那么 vm 就是 myData 的代理 (類似房東租房通過(guò)中介)
  • 比如 myData.n 不用伴嗡,偏要用 vm.n 來(lái)操作 myData.n
    代碼案例:bold-heyrovsky-8jcm2 - CodeSandbox

vm = new Vue({data: myData}) 就做了和上面代碼類似的事情急波。

  1. vm 成為了 myData 的代理
  2. 會(huì)對(duì) mydata 的所有屬性進(jìn)行監(jiān)控

目的: 無(wú)論直接修改 myData.n 還是修改 vm.n,vm 都會(huì)收到通知瘪校,然后調(diào)用觸發(fā)重新渲染

Vue 對(duì) methods 和 computed 也有類似處理澄暮。

Object.defineProperty 的問(wèn)題

Object.defineProperty(obj, 'n', {...}
必須有 'n' 才可以監(jiān)聽(tīng)&代理 obj.n

//無(wú) data.n
new Vue({
  data: {},
  template: `
    <div>{{n}}</div>
  `
}).$mount("#app");

無(wú) data.n 或 data.n 的值為 undefined ,此時(shí) n 被引用阱扬,不會(huì)有顯示朴沿,控制臺(tái)會(huì)報(bào)警告

//有 data.obj餐胀,但無(wú) data.obj.n
new Vue({
  data: {
    obj: {
      a: 0 // obj.a 會(huì)被 Vue 監(jiān)聽(tīng) & 代理
    }
  },
  template: `
    <div>
      {{obj.b}}
      <button @click="setB">set b</button>
    </div>
  `,
  methods: {
    setB() {
      this.obj.b = 1; //不顯示1
    }
  }
}).$mount("#app");

data.obj 中開(kāi)始并沒(méi)有 b痢甘,后面運(yùn)行 this.obj.b = 1 并不會(huì)讓 1 出現(xiàn)在頁(yè)面中宪拥,因?yàn)?vm 沒(méi)有監(jiān)聽(tīng)&代理 data.obj.b

解決辦法:

  1. 在開(kāi)始就定義好 data.obj.n = undefined
  2. 使用 Vue.set 或者 this.$set
    一個(gè)特例:
//html
<div id="app">
    <span class=span-a>
      {{obj.a}} 
    </span>
    <span class=span-b>
      {{obj.b}}
    </span>
  </div>
js

//js
var app = new Vue({
  el: '#app',
  data: {
    obj: {
      a: 'a',
    }
  },
})
app.obj.a = 'a2'
app.obj.b = 'b'

最終 span-a 中會(huì)顯示 a2,span-b 中顯示 b
這是因?yàn)橐晥D更新是異步的窃蹋,a1 變成 a2 時(shí)卡啰,Vue 監(jiān)聽(tīng)到這個(gè)變化静稻,并不會(huì)馬上更新視圖,而是創(chuàng)建一個(gè)視圖更新任務(wù)到任務(wù)隊(duì)列里匈辱。然后繼續(xù)運(yùn)行代碼 app.obj.b = 'b'振湾。視圖更新時(shí),Vue 會(huì)去做 diff亡脸,發(fā)現(xiàn) a 和 b 都變了押搪,于是去更新 span-a 和 span-b。

Vue.set 和 this.$set

作用:

  1. 新增key
  2. 自動(dòng)創(chuàng)建代理和監(jiān)聽(tīng)(如果沒(méi)有創(chuàng)建過(guò))
  3. 觸發(fā)UI更新(不會(huì)立即更新)
this.$set(this.object,'m',100)

變異方法

在數(shù)組中浅碾,數(shù)組的長(zhǎng)度一直增加大州,下標(biāo)就是key,沒(méi)辦法提前聲明所有下標(biāo)垂谢,難道每次改數(shù)組都要Vue.set 或者 this.$set摧茴?

new Vue({
  data: {
    array: ["a", "b", "c"]
  },
  template: `
    <div>
      {{array}}
      <button @click="setD">set d</button>
    </div>
  `,
  methods: {
    setD() {
      this.array[3] = "d"; //不顯示d
    }
  }
}).$mount("#app");

使用變異方法
push()、pop()埂陆、shift()、unshift()娃豹、splice()焚虱、sort()、reverse()

new Vue({
  data: {
    array: ["a", "b", "c"]
  },
  template: `
    <div>
      {{array}}
      <button @click="setD">set d</button>
    </div>
  `,
  methods: {
    setD() {
      this.array.push('d'); //修改后的push可完成我們想要的操作
    }
  }
}).$mount("#app");
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末懂版,一起剝皮案震驚了整個(gè)濱河市鹃栽,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌躯畴,老刑警劉巖民鼓,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異蓬抄,居然都是意外死亡丰嘉,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門嚷缭,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)饮亏,“玉大人,你說(shuō)我怎么就攤上這事阅爽÷沸遥” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵付翁,是天一觀的道長(zhǎng)简肴。 經(jīng)常有香客問(wèn)我,道長(zhǎng)百侧,這世上最難降的妖魔是什么砰识? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任能扒,我火速辦了婚禮,結(jié)果婚禮上仍翰,老公的妹妹穿的比我還像新娘赫粥。我一直安慰自己,他們只是感情好予借,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開(kāi)白布越平。 她就那樣靜靜地躺著,像睡著了一般灵迫。 火紅的嫁衣襯著肌膚如雪秦叛。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 52,736評(píng)論 1 312
  • 那天瀑粥,我揣著相機(jī)與錄音挣跋,去河邊找鬼。 笑死狞换,一個(gè)胖子當(dāng)著我的面吹牛避咆,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播修噪,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼查库,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了黄琼?” 一聲冷哼從身側(cè)響起樊销,我...
    開(kāi)封第一講書(shū)人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎脏款,沒(méi)想到半個(gè)月后围苫,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡撤师,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年剂府,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丈氓。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡周循,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出万俗,到底是詐尸還是另有隱情湾笛,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布闰歪,位于F島的核電站嚎研,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜临扮,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一论矾、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧杆勇,春花似錦贪壳、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至钻注,卻和暖如春蚂且,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背幅恋。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來(lái)泰國(guó)打工杏死, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人捆交。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓淑翼,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親品追。 傳聞我的和親對(duì)象是個(gè)殘疾皇子窒舟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容