Вам не нужны keyup
И v-model
, они могут закончиться конфликтом. Я считаю, что проще использовать вычисленное значение (или часы с отформатированной версией).
шаблон:
<div id="app">
<v-app id="inspire">
<v-form ref="form" v-model="valid" lazy-validation>
<v-flex lg3="">
<v-text-field :prefix="currency" v-model="initialBalanceFormatted" label="Balance" :disabled="disabled"></v-text-field>
</v-flex>
</v-form>
</v-app>
</div>
скрипт:
function formatAsCurrency (value, dec) {
dec = dec || 0
if (value === null) {
return 0
}
return '' + value.toFixed(dec).replace(/(\d)(?=(\d\d\d)+(?!\d))/g, "$1,")
}
new Vue({
el: '#app',
data: () => ({
valid: true,
disabled: false,
currency: "£",
initialBalance: null,
}),
computed: {
initialBalanceFormatted: {
get: function() {
return formatAsCurrency(this.initialBalance, 0)
},
set: function(newValue) {
this.initialBalance = Number(newValue.replace(/[^0-9\.]/g, ''));
}
}
}
})
Помогает превратить эти входы в отдельные (многократно используемые) компоненты, если у вас более одного или двух.
Вот пример, который я сделал некоторое время назад, в котором используются компоненты, которые могут обрабатывать другие типы, такие как процент, форматирование только после размытия (так что ваша запятая не прыгает) и позволяет использовать клавиши вверх и вниз для увеличения / уменьшения
https://codepen.io/scorch/pen/oZLLbv?editors=1010