在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問(wèn)答/HTML/ Vue2的響應(yīng)式問(wèn)題

Vue2的響應(yīng)式問(wèn)題

最近學(xué)習(xí)Vue2, 遇到2個(gè)問(wèn)題:

1.data的屬性是對(duì)象, 通過(guò)賦值直接設(shè)置對(duì)象的屬性值, 原本不應(yīng)該視圖更新的, 但是如果設(shè)置data另一個(gè)屬性的值, 導(dǎo)致視圖更新, 同時(shí)會(huì)導(dǎo)致這個(gè)對(duì)象的視圖更新.

<div id="app">
    <div>
        {{message}}
    </div>

    <div>
        {{object.name}}
    </div>
</div>
var vm = new Vue({
    el: "#app",
    data(){
        return {
            message: "message初始值",
            object: {}
        }
    }
});

// vm.$set(vm.object, "name", "通過(guò)set設(shè)置object的屬性的值");

// 通過(guò)賦值, 直接設(shè)置屬性值, 頁(yè)面視圖沒(méi)有更新
vm.object.name = "設(shè)置object的屬性的值";

// 取消注釋這句話, 會(huì)觸發(fā)上面這句話的視圖更新!
//vm.message = "設(shè)置message的值";

// vm.$forceUpdate();

2.setTimeout里面, 即使通過(guò)Vue.set沒(méi)有視圖更新

<div id="app">
    <div>
        {{message}}
    </div>

    <div>
        {{object.name}}
    </div>
</div>
var vm = new Vue({
    el: "#app",
    data(){
        return {
            message: "message初始值",
            object: {}
        }
    }
});

// 如果取消注釋這個(gè), 那setTimeout里面的視圖會(huì)更新
// vm.$set(vm.object, "name", "設(shè)置object的屬性的值");
vm.object.name = "不通過(guò)set, 設(shè)置object的屬性的值";

setTimeout(function(){
    // 頁(yè)面視圖沒(méi)有更新
    vm.$set(vm.object, "name", "通過(guò)set設(shè)置object的屬性的值");
    // vm.$forceUpdate();
}, 500);

不知描述的是否清晰, 請(qǐng)幫忙看看(沒(méi)百度到), 感激!

回答
編輯回答
雅痞
  1. 無(wú)法檢測(cè)屬性的添加,所以不響應(yīng),所以才需要 $set;同時(shí) vue 更新單位是組件,所以每次更新時(shí)會(huì)更新整個(gè)組件,message 的更新導(dǎo)致組件更新,導(dǎo)致同步了 object。
  2. vm.object.name ='xxxx' 有關(guān),可能算是個(gè)bug,我去提個(gè) issues。

好吧,發(fā)現(xiàn)這個(gè) issues 的 PR 已經(jīng)有了,還沒(méi)合并,簡(jiǎn)單的說(shuō)就是 $set 對(duì)已經(jīng)存在的 屬性無(wú)效,你前面使用直接添加的方式添加了屬性。

2018年2月19日 03:44