Posteriormente a consultar expertos en esta materia, programadores de diversas ramas y maestros dimos con la respuesta a la interrogande y la dejamos plasmada en esta publicación.
Solución:
Este es uno de esos casos en los que realmente desea utilizar un componente.
Aquí está un componente de ejemplo que hace un textarea
y limita la cantidad de texto.
Tenga en cuenta: esto no es una producción lista, maneje todos los componentes de las cajas de las esquinas. Está pensado como un ejemplo.
Vue.component("limited-textarea",
props:
value: type: String, default: "",
max:type: Number, default: 250
,
template: `
`,
computed:
internalValue:
get() return this.value,
set(v) this.$emit("input", v)
,
methods:
onKeyDown(evt)
if (this.value.length >= this.max)
if (evt.keyCode >= 48 && evt.keyCode <= 90)
evt.preventDefault()
return
)
Este componente implementa v-model
y solo emite un cambio en los datos si la longitud del texto es menor que el máximo especificado. Lo hace escuchando keydown
y evitando la acción predeterminada (escribir un carácter) si la longitud del texto es igual o superior al máximo permitido.
console.clear()
Vue.component("limited-textarea",
props:
value: type: String, default: "",
max:type: Number, default: 250
,
template: `
`,
computed:
internalValue:
get() return this.value,
set(v) this.$emit("input", v)
,
methods:
onKeyDown(evt)
if (this.value.length >= this.max)
if (evt.keyCode >= 48 && evt.keyCode <= 90)
evt.preventDefault()
return
)
new Vue(
el: "#app",
data:
text: ""
)
Otro problema con el código en la pregunta es que Vuex no le permitirá establecer un valor de estado directamente; tienes que hacerlo a través de una mutación. Dicho esto, debería haber una mutación de Vuex que acepte el nuevo valor y lo establezca, y el código debería confirmar la mutación.
mutations:
setGiftMessage(state, message)
state.user.giftMessage = message
Y en tu Vue:
computed:
giftMessage:
get()return this.$store.state.user.giftMessage,
set(v) this.$store.commit("setGiftMessage", v)
Técnicamente, el código debería estar usando un getter
para obtener el usuario (y es giftMessage), pero esto debería funcionar. En la plantilla usarías:
Aquí hay un ejemplo completo usando Vuex.
console.clear()
const store = new Vuex.Store(
state:
user:
giftMessage: "test"
,
getters:
giftMessage(state)
return state.user.giftMessage
,
mutations:
setGiftMessage(state, message)
state.user.giftMessage = message
)
Vue.component("limited-textarea",
props:
value: type: String, default: "",
max:type: Number, default: 250
,
template: `
`,
computed:
internalValue:
get() return this.value,
set(v) this.$emit("input", v)
,
methods:
onKeyDown(evt)
if (this.value.length >= this.max)
if (evt.keyCode >= 48 && evt.keyCode <= 90)
evt.preventDefault()
return
)
new Vue(
el: "#app",
store,
computed:
giftMessage:
get() return this.$store.getters.giftMessage,
set(v) this.$store.commit("setGiftMessage", v)
)
Message: giftMessage
Lamento interrumpir. Estaba buscando una solución. Los miré a todos. Para mí se ven demasiado complicados. Siempre busco la sencillez. Por eso me gusta la respuesta de @Даниил Пронин. Pero tiene el de @J. Rambo notó un problema potencial.
Para mantenerse lo más cerca posible del elemento de texto html nativo. La solución que se me ocurrió es:
Plantilla Vue
JavaScript
let app = new Vue(
el: '#app',
data:
value: 'Vue is working!',
maxLengthInCars: 25
,
methods:
assertMaxChars: function ()
if (this.value.length >= this.maxLengthInCars)
this.value = this.value.substring(0,this.maxLengthInCars);
)
Aquí hay un enlace REPL: https://repl.it/@tsboh/LimitedCharsInTextarea
La ventaja que veo es:
- el elemento está lo más cerca posible del elemento nativo
- codigo sencillo
- área de texto mantiene el foco
- eliminar todavía funciona
- funciona con pegar texto también
De todos modos feliz codificación
Si bien estoy de acuerdo con la respuesta seleccionada. También puede evitar fácilmente la longitud mediante un controlador de eventos keydown.
Plantilla Vue
JavaScript
export default
name: 'SomeComponent',
data ()
return
myModel: ''
;
,
methods:
limit( event, dataProp, limit )
if ( this[dataProp].length >= limit )
event.preventDefault();
De esta manera, también puede usar la expresión regular para prevenir eventos del tipo de keys aceptado. Por ejemplo, si solo desea aceptar valores numéricos, puede hacer lo siguiente.
methods:
numeric( event, dataProp, limit )
if ( !/[0-9]/.test( event.key ) )
event.preventDefault();
Tienes la posibilidad comunicar esta reseña si te fue útil.