Vuejs 属性 或方法“welcome”未定义
Vuejs Property or method “welcome” is not defined
试图在我的组件中获取语言环境,但出现此错误:
[Vue warn]: Property or method "welcome" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.
代码
commented each file for better understanding.
app.js
全局定义 i18n
translations
和 switch languages drop-down
//.....
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
import i18n from './components/Layouts/localesData' // translations
Vue.component('locale-dropdown', require('./components/Layouts/locales').default); // switch langs drop-down
const app = new Vue({
el: '#app',
router,
store,
i18n,
render: h => h(App)
});
localesData.js
翻译
export default {
en: {
welcome: `<h1>welcome<h1>`,
},
id: {
welcome: `<h1>selamat datang<h1>`,
}
}
locales.js
定义支持的局部变量并在下拉列表中显示它们
<template>
<div class="dropdown">
<button
class="btn dropdown-toggle"
type="button"
id="dropdownMenuButton"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
{{ $i18n.locale | capitalize }}
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a
v-for="(locale, index) in locales"
:key="index"
class="dropdown-item"
href="#"
@click.prevent="setLocale(locale)"
>
{{ locale | capitalize }}
</a>
</div>
</div>
</template><script>
export default {
data() {
return {
locales: ["en", "id"],
};
},
filters: {
capitalize: function (value) {
if (!value) return "";
value = value.toString();
return value.toUpperCase();
},
},
methods: {
setLocale(language) {
this.$store
.dispatch("changeLocale", language)
.then(() => {
this.$i18n.locale = language;
})
.catch((error) => {});
},
},
};
</script>
store.js
在本地存储中存储用户选择的语言
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex)
import locale from "./locale";
const store = new Vuex.Store({
modules: {
locale
},
//....
})
// here is "import locale from "./locale";" in store.js file //
const CHANGE_LOCALE = "CHANGE_LOCALE";
export default {
state: {
locale: localStorage.getItem('locale') || 'en'
},
mutations: {
[CHANGE_LOCALE](state, language) {
state.locale = language;
},
},
actions: {
changeLocale({ commit }, language) {
return new Promise((resolve, reject) => {
localStorage.setItem('locale', language);
commit(CHANGE_LOCALE);
resolve('Success');
});
}
},
getters: {
}
}
welcome component
显示翻译
{{ $t(welcome) }} // return error
知道我为什么会出错以及如何解决吗?
要显示键 welcome
的本地化翻译,您的模板应将 welcome
指定为 字符串文字 (即 'welcome'
).否则,它会被视为一个 属性 名称,它需要存在于您的组件数据中。
<div>{{ $t('welcome') }}</div>
const messages = {
en: {
welcome: 'hello world'
},
ja: {
welcome: 'こんにちは、世界'
}
}
const i18n = new VueI18n({
locale: 'ja',
messages,
})
new Vue({ i18n }).$mount('#app')
<script src="https://unpkg.com/vue@2.6.12/dist/vue.min.js"></script>
<script src="https://unpkg.com/vue-i18n@8.22.2/dist/vue-i18n.js"></script>
<div id="app">
<p>{{ $t('welcome') }}</p>
</div>
已解决
我已经像这样更改了 app.js
中的代码,它解决了问题:
// changed the name from "i18n" to "localesData"
import localesData from './components/Layouts/localesData'
// instead defined "i18n" here
const i18n = new VueI18n({
locale: 'en',
messages: localesData, // and defined it as "messages" here
})
试图在我的组件中获取语言环境,但出现此错误:
[Vue warn]: Property or method "welcome" is not defined on the instance but referenced during render. Make sure that this property is reactive, either in the data option, or for class-based components, by initializing the property. See: https://vuejs.org/v2/guide/reactivity.html#Declaring-Reactive-Properties.
代码
commented each file for better understanding.
app.js
全局定义 i18n
translations
和 switch languages drop-down
//.....
import VueI18n from 'vue-i18n'
Vue.use(VueI18n)
import i18n from './components/Layouts/localesData' // translations
Vue.component('locale-dropdown', require('./components/Layouts/locales').default); // switch langs drop-down
const app = new Vue({
el: '#app',
router,
store,
i18n,
render: h => h(App)
});
localesData.js
翻译
export default {
en: {
welcome: `<h1>welcome<h1>`,
},
id: {
welcome: `<h1>selamat datang<h1>`,
}
}
locales.js
定义支持的局部变量并在下拉列表中显示它们
<template>
<div class="dropdown">
<button
class="btn dropdown-toggle"
type="button"
id="dropdownMenuButton"
data-toggle="dropdown"
aria-haspopup="true"
aria-expanded="false"
>
{{ $i18n.locale | capitalize }}
</button>
<div class="dropdown-menu" aria-labelledby="dropdownMenuButton">
<a
v-for="(locale, index) in locales"
:key="index"
class="dropdown-item"
href="#"
@click.prevent="setLocale(locale)"
>
{{ locale | capitalize }}
</a>
</div>
</div>
</template><script>
export default {
data() {
return {
locales: ["en", "id"],
};
},
filters: {
capitalize: function (value) {
if (!value) return "";
value = value.toString();
return value.toUpperCase();
},
},
methods: {
setLocale(language) {
this.$store
.dispatch("changeLocale", language)
.then(() => {
this.$i18n.locale = language;
})
.catch((error) => {});
},
},
};
</script>
store.js
在本地存储中存储用户选择的语言
import Vue from 'vue'
import Vuex from 'vuex'
import axios from 'axios'
Vue.use(Vuex)
import locale from "./locale";
const store = new Vuex.Store({
modules: {
locale
},
//....
})
// here is "import locale from "./locale";" in store.js file //
const CHANGE_LOCALE = "CHANGE_LOCALE";
export default {
state: {
locale: localStorage.getItem('locale') || 'en'
},
mutations: {
[CHANGE_LOCALE](state, language) {
state.locale = language;
},
},
actions: {
changeLocale({ commit }, language) {
return new Promise((resolve, reject) => {
localStorage.setItem('locale', language);
commit(CHANGE_LOCALE);
resolve('Success');
});
}
},
getters: {
}
}
welcome component
显示翻译
{{ $t(welcome) }} // return error
知道我为什么会出错以及如何解决吗?
要显示键 welcome
的本地化翻译,您的模板应将 welcome
指定为 字符串文字 (即 'welcome'
).否则,它会被视为一个 属性 名称,它需要存在于您的组件数据中。
<div>{{ $t('welcome') }}</div>
const messages = {
en: {
welcome: 'hello world'
},
ja: {
welcome: 'こんにちは、世界'
}
}
const i18n = new VueI18n({
locale: 'ja',
messages,
})
new Vue({ i18n }).$mount('#app')
<script src="https://unpkg.com/vue@2.6.12/dist/vue.min.js"></script>
<script src="https://unpkg.com/vue-i18n@8.22.2/dist/vue-i18n.js"></script>
<div id="app">
<p>{{ $t('welcome') }}</p>
</div>
已解决
我已经像这样更改了 app.js
中的代码,它解决了问题:
// changed the name from "i18n" to "localesData"
import localesData from './components/Layouts/localesData'
// instead defined "i18n" here
const i18n = new VueI18n({
locale: 'en',
messages: localesData, // and defined it as "messages" here
})