2017-01-02 15 views
0

摘要:我顯示了一些我從API獲得的數據。由於調用的異步性質和各種刷新率,我不能認爲當我從HTML代碼調用它時,我的Vue對象中的data將可用。 有沒有辦法處理Vue.js中的缺失數據?如何處理(現在)缺失的數據?

詳細說明:

下面的代碼工作因爲message.textVue實例的編譯時的定義(輸出hello world):

var vm = new Vue({ 
 
    el: '#root', 
 
    data: { 
 
    message: { 
 
     text: "hello" 
 
    } 
 
    } 
 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script> 
 

 
<div id="root"> 
 
    <span>{{message.text}}</span> 
 
    <span>world</span> 
 
</div>

如果message被定義通過外部行動(a調用例如一個API),那麼下面的代碼將會失敗:

var vm = new Vue({ 
 
    el: '#root', 
 
    data: { 
 
    } 
 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script> 
 

 
<div id="root"> 
 
    <span>{{message.text}}</span> 
 
    <span>world</span> 
 
</div>

我今天使用的解決方案是爲將之前被渲染的data位佔位符(默認值)我有機會用真實值更新它們,但是當data變得複雜時,這會使我的代碼變得複雜(並且醜化)我的代碼。

有沒有辦法指示Vue.js在達到data未定義(尚未)定義的元素時自動失敗?

回答

0

您可以使用v-if,而不是直到數據被加載,就像下面呈現的div:

var vm = new Vue({ 
 
    el: '#root', 
 
    data: { 
 
    message: {} 
 
    }, 
 
    mounted() { 
 
    var vm = this 
 
    setTimeout(function(){ 
 
     vm.message = {'text' : 'Hello'} 
 
    }, 400) 
 
    } 
 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script> 
 

 
<div id="root"> 
 
    <div v-if="message.text"> 
 
    <span>{{message.text}}</span> 
 
    <span>world</span> 
 
    </div> 
 
</div>

如果您知道message數據的結構,你可以先初始化它空字符串,並不需要任何v-if或其他機制來防止此錯誤。

var vm = new Vue({ 
 
    el: '#root', 
 
    data: { 
 
    message: { 
 
     text: '' 
 
    } 
 
    }, 
 
    mounted() { 
 
    var vm = this 
 
    setTimeout(function(){ 
 
     vm.message.text = 'Hello' 
 
    }, 400) 
 
    } 
 
})
<script src="https://cdnjs.cloudflare.com/ajax/libs/vue/2.0.3/vue.js"></script> 
 

 
<div id="root"> 
 
    <div> 
 
    <span>{{message.text}}</span> 
 
    <span>world</span> 
 
    </div> 
 
</div>

+0

謝謝你,這是一個好主意,但我有很多這樣的數據(其初始渲染後初始化) – WoJ

+0

會增添了不少的「物流」代碼@WoJ如果你知道消息數據的結構,你可以初始化爲空字符串,並且不需要任何「後勤」代碼來防止這個錯誤。看到我更新的答案。 – Saurabh

+0

這就是我今天所做的(我在問題結尾處提到過),並且想避免它,因爲它會創建一大堆沒用的數據(從邏輯/代碼的可讀性角度來講) 。我希望我能以某種方式隱藏它。我知道傳入數據的結構,所以它會或多或少地等同於複製我所得到的模式(使用默認的空值/空值) – WoJ

0

你可以只聲明瞭一個變量asyncData當數據進來更新它,如果你宣佈一個空對象的鍵不存在Vue公司不會引發錯誤:

var vm = new Vue({ 
    el: '#app', 
    data: { 
    asyncData: {} 
    } 
}); 

然後當數據到達時,你可以設置它,並迫使Vue的情況下重新渲染:

// Receive data 
vm.asyncData['message'] = "Hello World!"; 
vm.$forceUpdate(); 

這裏的的jsfiddle:https://jsfiddle.net/tvzjsb7e/

+0

謝謝你的想法,但這不適用於我給出的示例數據在我的問題中,數據是嵌套散列。 – WoJ

+2

也許你可以嘗試在一個方法中做並通過鍵循環,它取決於你的'數據'有多複雜,但是這應該在基本層面上工作,這裏是JSFiddle:https://jsfiddle.net/djfjpL8v / –