Quero gerenciar o valor do a
estado (para fazer validações personalizadas, então não usarei bind:value
) para passar para minha entrada, mas o valor exibido na entrada não é o valor que tenho no a
estado, por que isso aconteceu?
<script lang="ts">
let a = "";
const onChange = (e: any) => {
const nv = e.target.value;
if (nv.length <= 4) {
a = nv;
}
};
</script>
<div>value:{a}</div>
<input type="text" value={a} on:input={onChange} />
Eles ficam fora de sincronia, pois você não está usando uma ligação e
a
não está sendo alterado. O valor de entrada só é atualizado quandoa
realmente muda.Isso também significa que você não pode simplesmente definir
a = a
para forçar uma atualização, já que nenhuma alteração seria detectada. Há maneiras de contornar isso, por exemplo, definir um valor intermediário diferente (embora você tenha que esperar um tique para que isso tenha efeito, o que pode ter consequências não intencionais).Se você usar
keydown
em vez deinput
, você pode cancelar isso usandopreventDefault()
. No entanto, as entradasvalue
no momento do evento não incluirão o efeito do pressionamento da tecla, ainda.A restrição de comprimento também pode ser feita via HTML simples:
A solução mais fácil é provavelmente definir o valor de entrada manualmente no evento, da seguinte forma: