为了账号安全,请及时绑定邮箱和手机立即绑定

在 Vue.js 中按类将文本附加到多个元素

在 Vue.js 中按类将文本附加到多个元素

慕田峪7331174 2023-10-20 15:14:11
我知道我想做的是直接修改 dom(在 vue.js 中不行),但是我能想到的唯一替代方案会创建更草率且更难以维护的代码。问题我正在使用 vue-i18n,根据用户当前选择的语言,我想将货币符号移动到价格元素的前面或后面(我有许多元素在许多页面上显示价格,实际上超过 150 个) .)备择方案我能想到的最好的替代方案是为每个需要交换的元素添加一个绑定,但要做到这一点,我必须在该网站有价格的 15 个单独页面中的每个页面中:class添加大量 + v-ifs+额外标记mapGetters上(+ vuex 逻辑)。我可能还必须在 css 中使用::beforeand ::after,为每种语言创建一个类,并在每种语言中添加符号content: ''。新考虑的解决方案我认为简单地使用一个mounted钩子(以便子视图完全渲染)然后调用一个函数在包含该类的所有元素之前或之后附加货币符号可能会更app.vue干净。nextTick()priceItem这样,我就不会有所有额外的标记和v-ifs 污染我的模板,尽管我会直接修改 dom,尽管只有在所有内容都渲染之后。是否有任何替代方案可以让我获得我想要的简单性,但仍然使用 Vue 类型模式来完成它?示例代码(app.vue)   this.$nextTick(function () {  // Get currently selected lang from i18n  let lang = this.$i18n.locale  // get correct currency symbol for selected language  let symbol = ''  switch (lang) {    case 'ko':      symbol = '₩'      break    case 'en':      symbol = '$'      break    case 'ja':      symbol = '¥'      break    case 'zh':      symbol = '¥'      break    case 'es':      symbol = '€'      break    case 'ru':      symbol = '₽'      break  }  // if lang is Korean append symbol after, else append before  if (lang !== 'ko') {    document      .querySelector('priceItem')      .insertAdjacentText('beforeBegin', symbol)  } else {    document      .querySelector('priceItem')      .insertAdjacentText('afterBegin', symbol)  }})编辑:想想看,这在道具中可能会更好computed,这样我就可以在用户更改语言时重新分配符号。
查看完整描述

1 回答

?
慕村225694

TA贡献1880条经验 获得超4个赞

对于任何正在寻找 Vue 快速解决方案的人,我使用这个包来解决我的问题:


https://github.com/vinayakkulkarni/vue-intl-numberformat


我在模板中使用了以下格式:


<vue-intl-numberformat

   locale="en-IN"

   format-style="currency"

   :currency="getCurrency"

   :number="item.price"

 />

...


computed: {

   ...mapGetters(['getCurrency'])

}

然后我根据 i18n 中主动选择的语言通过 getter 向其传递正确的货币。


(在我的 vuex 商店中)


  getCurrency: (state) => {

    let activeLang = i18n.locale

    let currency = ''


    switch (activeLang) {

      case 'en':

        currency = 'USD'

        break

      case 'ko':

        currency = 'KRW'

        break

      case 'ja':

        currency = 'JPY'

        break

      case 'es' || 'fr' || 'it':

        currency = 'EUR'

        break

      case 'zh':

        currency = 'CNY'

        break

      case 'ru':

        currency = 'RUR'

        break

    }

    state.currency = currency

    return state.currency

  }

这似乎是迄今为止最干净的解决方案。


查看完整回答
反对 回复 2023-10-20
  • 1 回答
  • 0 关注
  • 85 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信