我知道我想做的是直接修改 dom(在 vue.js 中不行),但是我能想到的唯一替代方案会创建更草率且更难以维护的代码。
我正在使用 vue-i18n,根据用户当前选择的语言,我想将货币符号移动到价格元素的前面或后面(我有许多元素在许多页面上显示价格,实际上超过 150 个) .)
我能想到的最好的替代方案是为每个需要交换的元素添加一个绑定,但要做到这一点,我必须在该网站有价格的 15 个单独页面中的每个页面中:class
添加大量 + v-ifs
+额外标记mapGetters
上(+ vuex 逻辑)。我可能还必须在 css 中使用::before
and ::after
,为每种语言创建一个类,并在每种语言中添加符号content: ''
。
我认为简单地使用一个mounted
钩子(以便子视图完全渲染)然后调用一个函数在包含该类的所有元素之前或之后附加货币符号可能会更app.vue
干净。nextTick()
priceItem
这样,我就不会有所有额外的标记和v-if
s 污染我的模板,尽管我会直接修改 dom,尽管只有在所有内容都渲染之后。
是否有任何替代方案可以让我获得我想要的简单性,但仍然使用 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,这样我就可以在用户更改语言时重新分配符号。
慕村225694
相关分类