Просто отобразить отформатированную версию значения можно с помощью простого фильтра:
new Vue({
el: '#app',
data: {
tmp_price1: '123123',
tmp_price2: '',
tmp_price3: ''
},
filters: {
myFilter(v) {
return v.replace(/\D/g, '').replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
}
});
<script src="https://unpkg.com/vue@latest/dist/vue.js"></script>
<div id="app">
<div><input v-model="tmp_price1">{{tmp_price1 | myFilter}}</div>
<div><input v-model="tmp_price2">{{tmp_price2 | myFilter}}</div>
<div><input v-model="tmp_price3">{{tmp_price3 | myFilter}}</div>
</div>
... но этого недостаточно для полей ввода;Вы не можете просто добавить фильтр к атрибуту v-model
.Подкомпонент, как описано в ответ Роя J , вероятно, является лучшим и наиболее пригодным для повторного использования способом справиться с этим, но если вы в порядке с чем-то немного быстрым и грязным (но не с тоже грязно) вы можете просто добавить обработчик изменений к проблеме:
new Vue({
el: '#app',
data: {
tmp_price1: '123123',
tmp_price2: '',
tmp_price3: ''
},
methods: {
myFormatter(fieldname) {
/* replace the user's input with the formatted value.
There's probably some clever way to read the v-model
name from the input field instead of passing it to the
method as a string, but I'm not going to mess around
with that for what is after all a quick-and-dirty technique */
this[fieldname] = this[fieldname].replace(/\D/g, "").replace(/\B(?=(\d{3})+(?!\d))/g, ",");
}
},
mounted() {
// if the initial values aren't always empty, you'll need to run the
// formatter function on component load as well as on user input:
['tmp_price1', 'tmp_price2', 'tmp_price3'].forEach(f => {
this.myFormatter(f);
});
}
});
<script src="https://unpkg.com/vue@latest/dist/vue.js"></script>
<div id="app">
<div><input v-model="tmp_price1" @input="myFormatter('tmp_price1')">{{tmp_price1}}</div>
<div><input v-model="tmp_price2" @input="myFormatter('tmp_price2')">{{tmp_price2}}</div>
<div><input v-model="tmp_price3" @input="myFormatter('tmp_price3')">{{tmp_price3}}</div>
</div>
(Или, как другой вариант, этот ответ на похожий вопрос использует, по сути, ту же технику, но заключает ее в директиву Vue длясвязывайте события ввода вместо того, чтобы прикреплять обработчики @input
.)
Обратите внимание, что в версии «filter» значения v-model
остаются исходным пользовательским вводом;фильтр влияет только на отображаемое значение.Во втором примере форматирование применяется к самим v-model
значениям ed, поэтому, если вы передадите эти значения в другое место, вы получите отформатированную версию.Оба метода могут быть полезны, в зависимости от обстоятельств.(Или вы можете даже использовать их в комбинации - удалите не-цифры в v-модели, затем добавьте запятые через фильтр только для отображения, например.)