使VueI18n对路由器链接标签做出反应

时间:2019-01-21 21:20:09

标签: javascript vue.js vue-i18n

我有这个Vue应用,它由一个简单的首页,标题和首页文字组成。您可以在我的JSFiddle上在线查看此应用。这是代码:

HTML

<div id="app">
  My header app
  <router-view></router-view>
</div>

JavaScript

const Home = {
    template: `
      <div>
        <h1>{{ $t('home.title') }}</h1>
        <p v-html="$t('home.text')"></p>
      </div>
    `
};

const messages = {
    en: {
    home: {
        title: 'Hello world',
        text: 'Find all post by clicking <router-link to="/post">this link</router-link>!'
    }
  }
};

const routes = [
    { name: 'home', path: '*', component: Home }
];

const i18n = new VueI18n({
    locale: 'en',
    fallbackLocale: 'en',
    messages: messages
});

const router = new VueRouter({
    mode: 'history',
    routes: routes
});

const vue = new Vue({
    el: '#app',
    router: router,
    i18n: i18n
});

问题

如您所见,没有可见的“ router-link”链接,单击该链接将不会重定向到所需的路由。

问题

是否可以使VueI18n在<router-link>指令中解释v-html标签?

1 个答案:

答案 0 :(得分:1)

v-htmlplain HTML替换元素的内容,因此替换字符串中使用的自定义元素不会编译为Vue.js组件。

您可能要检查VueI18n documentation建议的组件插值方式,其中涉及i18n功能组件和模板字符串的使用。

以下是实现此方法的提琴的分叉:http://jsfiddle.net/u5vx1mLq/

简而言之,i18n组件具有path属性,您可以在其中放置模板字符串,而tag属性具有定义标签的位置,i18n组件将被替换用。 i18n还有一个插槽,可用于定义子组件,在其中可以插入模板字符串的部分内容。

对于尴尬的解释,我们深表歉意,希望代码片段能为您解决这个问题:

const Home = {
  template: `
    <div>
      <h1>{{ $t('home.title') }}</h1>
      <i18n path="home.linkLabel" tag="label" for="home.linkText">
        <router-link to="/post">{{ $t('home.linkText') }}</router-link>
      </i18n>
    </div>
  `
};

const messages = {
  en: {
    home: {
      title: 'Hello world',
      linkText: 'this link',
      linkLabel: 'Find all post by clicking {0}'
    }
  }
};