2016-12-29 83 views
3

我使用過濾功能,用於國際化這樣的:返回VUE實例(Vue.js 2)

<div>{{ "hello" | message }}<div> 

消息是濾波器函數,取決於全局變量Vue.config.lang 。

它很好,但如果我改變Vue.config.lang,消息不會重新渲染。

我想讓消息重新呈現隨時隨地Vue.config.lang變化,讓我改變了我的過濾功能從

message => locale_messages[Vue.config.lang][message] 

message => new Vue({ 
    template: '{{ message }}', 
    computed: { 
    message() { return locale_messages[Vue.config.lang][message]; } 
    } 
}) 

但它不工作。得到這個錯誤:

Uncaught TypeError: Converting circular structure to JSON 
    at Object.stringify (<anonymous>) 
    .... 

有什麼我可以做,使它的工作?我是Vue.js的新手,找不到工作解決方案。

+0

在你的位置,我會盡力挖掘到一些組件:https://github.com/vuejs/awesome-vue#i18n我認爲你可以找到一些線索如何應該在Vue中使用i18n,因爲我認爲你做錯了... –

+1

現在是消息組件嗎?你能提供一些代碼嗎? – Nora

回答

2

像埃文說,過濾器應該是pure,所以他不能使用全局變量作爲關鍵從外部數組中獲取值。由於副作用。

因此,有你的問題三種解決方案來在我的腦海:

  • 的方法更換過濾器。
  • 使用vue-i18-n,翻譯
  • 一個簡單而功能強大的模塊使用商店系統(vuex)至極爲您提供干將,並幫助您管理全局狀態。

Personnaly我喜歡一起使用vuex和vue-i18-n。以這種方式,我可以集中我的數據和正在使用的語言。我還可以使用商店以多種語言提供特定數據,並讓vue-i18-n關心項目中的所有字符串。

0

Vue是我自己的新成員,所以不太確定全局變量是如何工作的,但是您絕對可以將params傳遞給自定義過濾器 - 即使是Vue參考。你可以這樣做:

<!-- this = a reference to the vue instance --> 
<span class="display-3">{{value|FormatValue(this)}}</span> 

[...] 

props: ["aIsPercentNeeded"], 

[...] 

Vue.filter("FormatValue", function (aValue, aVueInstance) 
{ 
    if (!aVueInstance["aIsPercentNeeded"]) 
    { 
    return aValue; 
    } 

    return aValue + "%"; 
});