vue響應(yīng)式原理第二天

選擇題
1衷敌、下面關(guān)于 Vue.js 的數(shù)據(jù)響應(yīng)式描述正確的是:

  • A. 任何一個對象都可以被設(shè)置為響應(yīng)式對象,當(dāng)該對象的數(shù)據(jù)發(fā)生變化后可以通知視圖更新罐监。
  • B. 只有 Vue.js 中的選項 data (如:new Vue({ data: { } }))才可以設(shè)置為響應(yīng)式對象瞒爬,當(dāng)該對象的數(shù)據(jù)發(fā)生變化后通知視圖更新弓柱。
  • C. Dep 對象的作用是收集依賴侧但,每一個屬性都會對應(yīng)一個 Dep 對象,當(dāng)屬性變化時會調(diào)用 Dep 對象的 notify 方法發(fā)送通知更新視圖屁药。
  • D. 1個 Dep 對象可能會對應(yīng)多個 Watcher 對象,當(dāng)數(shù)據(jù)變化觸發(fā)依賴 Dep 對象通知對應(yīng)的 Watcher 對象更新視圖酿箭。( √ )

2趾娃、下面關(guān)于響應(yīng)式原理描述錯誤的是:

  • A. 給 data 對象的某個屬性設(shè)置為一個新的對象 (this.o = { name: 'xxx' })缭嫡,此對象是響應(yīng)式的抬闷。
  • B. 點擊按鈕的時候給 data 對象上的 obj 新增一個 name 屬性 (this.obj.name = 'xxx'),該屬性是響應(yīng)式的笤成。( × )
  • C. Vue.js 內(nèi)部當(dāng)數(shù)據(jù)變化后,直接更新真實 DOM纵诞。
  • D. Vue.js 內(nèi)部當(dāng)數(shù)據(jù)變化后培遵,首先操作的是虛擬 DOM。

簡答題
1荤懂、當(dāng)我們點擊按鈕的時候動態(tài)給 data 增加的成員是否是響應(yīng)式數(shù)據(jù),如果不是的話节仿,如果把新增成員設(shè)置成響應(yīng)式數(shù)據(jù),它的內(nèi)部原理是什么。

let vm = new Vue({
  el: '#el'
  data: {
    o: 'object',
    dog: {}
  },
  method: {
    clickHandler () {
      // 該 name 屬性是否是響應(yīng)式的
      this.dog.name = 'Trump'
    }
  }
})

答:不是響應(yīng)式數(shù)據(jù)女轿。響應(yīng)式對象和響應(yīng)式數(shù)組是指在vue初始化時期壕翩,利用Object.defineProperty()方法對其進(jìn)行監(jiān)聽,這樣在修改數(shù)據(jù)時會及時體現(xiàn)在頁面上放妈。
設(shè)置為響應(yīng)式數(shù)據(jù)有兩種方法:
1、給 dog 的屬性 name 設(shè)置一個初始值珍策,可以為空字符串或者 undefined 之類的宅倒,代碼和原因如下:

let vm = new Vue({
    el: '#app',
    data: {
        msg: 'object',
        dog: {
            name: ''
        }
    },
    method: {
        clickHandler() {
            // 該 name 屬性是否是響應(yīng)式的
            this.dog.name = 'Trump'
        }
    }
})
  • 原因:vm[key] setter 操作的時候會觸發(fā) data[key] 的 setter 操作,data[key] 的 setter 操作會 walk 這個新的值(walk方法是給data里的對象類型的值設(shè)置響應(yīng)式)拐迁,而題目中的 data 的 dog 是個空對象,沒有任何屬性线召,所以初始化 Vue 實例的時候,在給 dog 設(shè)置 proxy 的時候沒有任何屬性有 getter 和 setter 方法祟蚀,所以在點擊按鈕動態(tài)的給 dog 添加 name 屬性割卖,并設(shè)置值的時候是不會觸發(fā) dog 對象下的屬性 name 的 setter 方法,故不是響應(yīng)式數(shù)據(jù)鹏溯。而給 dog 對象添加了 name 的初始值后淹仑,dog 對象的 name 屬性就有了 getter 和 setter 方法,故可以實現(xiàn)響應(yīng)式匀借。

2、使用 Vue.set(target, key, value) 時吓肋,target 為需要添加屬性的對象,key 是要添加的屬性名肤舞,value 為屬性 key 對應(yīng)的值.源碼(參考鏈接:https://www.cnblogs.com/heavenYJJ/p/9559439.html)
1. 如果是在開發(fā)環(huán)境,且 target 未定義(為 null李剖、undefined )或 target 為基礎(chǔ)數(shù)據(jù)類型(string、boolean篙顺、number、symbol)時腋寨,拋出告警;
2. 如果 target 為數(shù)組且 key 為有效的數(shù)組 key 時萄窜,將數(shù)組的長度設(shè)置為 target.length 和 key 中的最大的那一個撒桨,然后調(diào)用數(shù)組的 splice 方法( vue 中重寫的 splice 方法)添加元素;
3. 如果屬性 key 存在于 target 對象中且 key 不是 Object.prototype 上的屬性時凤类,表明這是在修改 target 對象屬性 key 的值(不管 target 對象是否是響應(yīng)式的,只要 key 存在于 target 對象中谜疤,就執(zhí)行這一步邏輯),此時就直接將 value 直接賦值給 target[key]履肃;
4. 判斷 target坐桩,當(dāng) target 為 vue 實例或根數(shù)據(jù) data 對象時尺棋,在開發(fā)環(huán)境下拋錯绵跷;
5. 當(dāng)一個數(shù)據(jù)為響應(yīng)式時,vue 會給該數(shù)據(jù)添加一個 ob 屬性荆残,因此可以通過判斷target對象是否存在 ob 屬性來判斷 target 是否是響應(yīng)式數(shù)據(jù)净当,當(dāng) target 是非響應(yīng)式數(shù)據(jù)時内斯,我們就按照普通對象添加屬性的方式來處理;當(dāng) target 對象是響應(yīng)式數(shù)據(jù)時品擎,我們將 target 的屬性 key 也設(shè)置為響應(yīng)式并手動觸發(fā)通知其屬性值的更新备徐;

  • defineReactive(ob.value, key, val) ,將新增屬性設(shè)置為響應(yīng)式; ob.dep.notify() 手動觸發(fā)通知該屬性值的更新, 所以我們可以修改代碼如下:
let vm = new Vue({
        el: '#app',
        data: {
            msg: 'object',
            dog: {
                name: undefined
            }
        },
        method: {
            clickHandler() {
                // 該 name 屬性是否是響應(yīng)式的
                this.$set(this.data.dog, name, 'Trump')
            }
        }
    })
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市秀菱,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌衍菱,老刑警劉巖肩豁,帶你破解...
    沈念sama閱讀 219,490評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機缕坎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,581評論 3 395
  • 文/潘曉璐 我一進(jìn)店門篡悟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人搬葬,你說我怎么就攤上這事荷腊〔任” “怎么了?”我有些...
    開封第一講書人閱讀 165,830評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長码倦。 經(jīng)常有香客問我,道長勿璃,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,957評論 1 295
  • 正文 為了忘掉前任补疑,我火速辦了婚禮,結(jié)果婚禮上诊胞,老公的妹妹穿的比我還像新娘。我一直安慰自己撵孤,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,974評論 6 393
  • 文/花漫 我一把揭開白布邪码。 她就那樣靜靜地躺著咬清,像睡著了一般。 火紅的嫁衣襯著肌膚如雪旧烧。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,754評論 1 307
  • 那天斧拍,我揣著相機與錄音杖小,去河邊找鬼。 笑死予权,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的扫腺。 我是一名探鬼主播,決...
    沈念sama閱讀 40,464評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼攒至,長吁一口氣:“原來是場噩夢啊……” “哼躁劣!你這毒婦竟也來了迫吐?” 一聲冷哼從身側(cè)響起账忘,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤熙宇,失蹤者是張志新(化名)和其女友劉穎溉浙,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戳稽,經(jīng)...
    沈念sama閱讀 45,847評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡广鳍,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,995評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了赊时。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,137評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡诞吱,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出房维,到底是詐尸還是另有隱情抬纸,我是刑警寧澤咙俩,帶...
    沈念sama閱讀 35,819評論 5 346
  • 正文 年R本政府宣布阿趁,位于F島的核電站,受9級特大地震影響脖阵,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜命黔,卻給世界環(huán)境...
    茶點故事閱讀 41,482評論 3 331
  • 文/蒙蒙 一就斤、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧战转,春花似錦、人聲如沸槐秧。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,023評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至顿锰,卻和暖如春启搂,著一層夾襖步出監(jiān)牢的瞬間硼控,已是汗流浹背胳赌。 一陣腳步聲響...
    開封第一講書人閱讀 33,149評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留熏版,地道東北人。 一個月前我還...
    沈念sama閱讀 48,409評論 3 373
  • 正文 我出身青樓撼短,卻偏偏與公主長得像挺勿,于是被迫代替她去往敵國和親曲横。 傳聞我的和親對象是個殘疾皇子不瓶,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,086評論 2 355