<template>
<input
@input="formatValue"
type="text"
:value="formattedValue"
/>
</template>
<script type="text/javascript">
import {formatPhoneNumber} from '~/utils/string';
export default {
computed: {
formattedValue: function(){
return formatPhoneNumber(this.value)
},
},
methods: {
formatValue(e) {
this.$emit('input', formatPhoneNumber(e.target.value))
}
},
props: ['value']
}
</script>
Пока formatPhoneNumber(value)
выдает другое значение, все работает нормально, но как только достигается максимальная длина (начиная с formatPhoneNumber('xx xx xx xx xx whatever') == 'xx xx xx xx xx'
), выдаваемое значение совпадает с текущим хранилищем.
Это совершенно нормально, за исключением того, что, как следствие, состояние не изменяется и компонент не перерисовывается, поэтому formattedValue()
не вызывается.
Таким образом, я получаю xx xx xx xx xx
в магазине, но на входе отображается xx xx xx xx xx whatever
, поскольку локальное значение ввода отличается от значения в магазине.
Как я могу избежать этого неожиданного поведения? Перемещение formatPhoneNumber()
в хранилище не решило бы мою проблему, поскольку оно по-прежнему предотвратило бы мутацию, и только использование formatPhoneNumber()
в formattedValue()
привело бы к тому, что я получил бы неформатированное значение в хранилище, что мне тоже не нужно.
Почему Vue input
с динамическим набором value
все еще управляет локальным состоянием?
commit
вызывает мутацию наблюдаемого поля в хранилище. Вы можете подтвердить, что событие срабатывает? - person Ohgodwhy   schedule 10.12.2019addCellPhoneNumber(state, value) { console.log('commit called') state.cellPhoneNumber = value },
иcommit
вызывается, даже если форматирование не происходит на стороне получения компонента. - person Augustin Riedinger   schedule 10.12.2019this.$emit('input', null)
. Таким образом, два излучения за обновление. Чувствуется немного взломано, должен быть другой способ. - person   schedule 13.02.2020