Я создаю приложение Vue без использования npm. Поскольку существует слишком много руководств, относящихся к npm, я не могу им правильно следовать. Итак, я просто включил такие скрипты:
<script src="/js/bluebird.min.js"></script>
<script src="/js/vue.js"></script>
<script src="/js/vue-i18n.js"></script>
<script src="/js/axios.min.js"></script>
<script src="/js/components.js"></script>
<script src="/js/app.js"></script>
Пока я пытаюсь показать список кнопок, загружая их из файла json. Этот файл содержит массив объектов с информацией о кнопке, включая ее текст на разных языках. Итак, пока я не могу понять, как заставить vue-i18n загружать сообщения из этого файла. Основной код:
<buttons-list inline-template>
<div class="buttons-list">
<big-button inline-template
:class="[button.position, button.number]"
v-for="button in buttons"
:key="button.id"
:button="button">
<div class="big-button">{{ $t(button.text) }}</div>
</big-button>
</div>
</buttons-list>
Код компонента buttonsList:
Vue.component('buttons-list', {
data: function() {
return {
buttons: []
}
},
created: function() {
this.loadButtons()
},
methods: {
loadButtons: function() {
const list = this;
axios.get('/json/buttons.json')
.then(function(response) {
list.buttons = response.data
})
}
}
})
Здесь я читаю файл json при создании компонента, поэтому при создании bigButton свойство button
будет иметь всю необходимую информацию. Код компонента bigButton:
Vue.component('big-button', {
data: function() {
return {
text: ''
}
},
props: ['button'],
created: function() {
this.$i18n.setLocaleMessage('en', this.button.messages.en)
this.$i18n.setLocaleMessage('ru', this.button.messages.ru)
},
i18n: {
messages: {}
}
})
Здесь, в функции created
, я попытался установить экземпляр i18n.messages
в данные из файла json. В принципе, это работает, за исключением того, что он сбрасывает messages
для всех кнопок до текущих данных, в результате чего все кнопки имеют одинаковый текст последней кнопки. Можно ли работать с экземплярами компонентов в vue-i18n? Или есть другие способы, которые мне не хватает?
РЕШЕНИЕ
Я изменил код компонента bigButton
на:
Vue.component('big-button', {
data: function() {
return {
text: ''
}
},
props: {
button: {
type: Object,
default: function() {return {}}
},
},
created: function() {
this.$i18n.setLocaleMessage('en', this.button.messages.en)
this.$i18n.setLocaleMessage('ru', this.button.messages.ru)
},
i18n: {
//i18n stops working when this block removed
}
})
и это сработало!