Vue-单个文件组件中的翻译

时间:2019-01-19 12:22:45

标签: vue.js vue-router vue-i18n

我在翻译中使用vue-i18n,效果很好!但是,当我在单个文件组件的this.$t()函数内部使用data函数时,翻译不起作用。

 <template>
  <VFooter
      app
      height="auto"
      color="secondary">
    <VLayout
        justify-center
        row
        wrap>
      <VBtn
          v-for="link in links"
          :key="link.name"
          :to="{ name: link.name }"
          flat
          round
          active-class>
        {{ link.label }}
      </VBtn>
      <VFlex
          py-3
          text-xs-center
          xs12>
        &copy;{{ currentYear }} — <strong>{{ $t('site_name') }}</strong>
      </VFlex>
    </VLayout>
  </VFooter>
</template>

<script>
  export default {
    name: 'TheSiteFooter',
    data() {
      return {
        links: [
          { name: 'what-is-pinshop', label: this.$t('footer.what_is_pinshop') },
          { name: 'contact-us', label: this.$t('footer.contact_us') },
          { name: 'cookie-policy', label: this.$t('footer.cookie_policy') },
          { name: 'privacy-policy', label: this.$t('footer.privacy_policy') },
          { name: 'terms-and-conditions', label: this.$t('footer.terms_and_conditions') },
        ],
      };
    },
    computed: {
      currentYear() {
        return new Date().getFullYear();
      },
    },
  };
</script>

但是,如果我改为仅使用翻译键来更改data,然后在模板中使用{{ $t('footer.what_is_pinshop') }},则说明翻译是正确的。为什么会这样?我正在使用beforeEnter路由器防护来更改翻译。我已关注this example

更新

如果我将links用作计算属性,则翻译有效。那么,为什么不只在data属性中发生这种情况呢?我也尝试过使用this.$i18n.t(),但没有尝试

1 个答案:

答案 0 :(得分:1)

这是因为vue生命周期。使用link钩子将created数据推入数组。保持data(模型)干净,不要在其中调用函数。您在所有事件和反应机制都未注册之前就调用它。

生命周期:https://vuejs.org/v2/guide/instance.html

如果您对它的工作方式感兴趣:https://github.com/kazupon/vue-i18n/tree/dev/src

更新 我刚洗完澡,再三考虑。从深度上讲,这是由于反应机制。使用函数初始化数据,vue无法检测到返回值是否已更改。看看它是如何工作的:在{vue 3}中,https://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Object/definePropertyhttps://developer.mozilla.org/de/docs/Web/JavaScript/Reference/Global_Objects/Proxy

所取代