Business
Jobs
  • About Us
  • Solutions
    • Job Postings
      Post your job and receive qualified candidates in 48h.
    • Candidate Assessments
      500+ technical and psychological tests, plus anti-fraud.
    • Headhunting
      Tailor-made executive search from start to finish.
    • Payroll + EOR
      Payroll dispersal and EOR across 15+ LATAM countries.
  • Pricing
  • Jobs

0

478
Views
¿Por qué vue v-model no funciona para un accesorio de matriz?

Tengo un componente personalizado que toma la propiedad modelValue y emite el evento update:modelValue . En el componente principal, paso una matriz:

TestComponent.vue

 <template> <div> <button @click="updateIt">Test</button> </div> </template> <script> export default { props: { modelValue: Array }, emits: ["update:modelValue"], setup(props, {emit}){ return { updateIt(){ emit("update:modelValue", [4,5,6]) } } } } </script>

aplicación.vue

 <template> <div> <test-component v-model="myArr"/> <ul> <li v-for="i in myArr" v-text="i"></li> </ul> </div> </template> <script> import TestComponent from "./TestComponent.vue"; export default { components: { TestComponent }, setup(props, {emit}){ const myArr = reactive([1,2,3]); return { myArr } } } </script>

La lista no se actualiza cuando presiono el botón, ¿por qué?

over 4 years ago · Santiago Trujillo
1 answers
Answer question

0

Internamente, la directiva v-model se cambia a una función de controlador para el evento update:modelValue que se parece a esto:

$event => ((exp => $event) donde exp es la expresión en la directiva

lo que básicamente significa que, cuando se emite el evento update:modelValue , el valor que emite se asigna directamente a la variable myArr , reemplazando efectivamente toda la variable reactive sin desencadenar la cadena de reactividad, porque no ocurre a través del proxy.

Si myArr fuera una ref([]) vue lo detecta y la función del controlador se parece a esto:

$event => (exp ? (exp).value = $event : null) donde exp es la expresión en la directiva

lo que significa que el valor se asigna a través del proxy ref, lo que desencadena la cadena de reactividad.

Pero no hay una lógica interna que verifique si la expresión pasada es una matriz y, de ser así, hace algo de magia de empalme para mantener la variable original, debe hacerlo usted mismo.

Soluciones posibles:

1) usar una clave de objeto:

 <test-component v-model="myArr.data"/> ... const myArr = reactive({ data: [1,2,3] });

2) usar una referencia:

 <test-component v-model="myArr"/> ... const myArr = ref([1,2,3]);

3) use una función de controlador personalizado:

 <test-component :modelValue="myArr" @update:modelValue="onChange"/> ... const myArr = reactive([1,2,3]); function onChange(newval){ myArr.splice(0, myArr.length, ...newval); }
over 4 years ago · Santiago Trujillo Report
Answer question
Find remote jobs

Discover the new way to find a job!

Top jobs
Top job categories
Business
Post vacancy Pricing Sales
Legal
Terms and conditions Privacy policy
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Show me some job opportunities
There's an error!