Lors du portage d'une application existante de Vue2 vers Vue3, j'ai rencontré un problème surprenant.
Comment effectuer les modifications du moniteur Vue3 du tableau « externe » ?
Cela a bien fonctionné dans Vue2 mais a cessé de fonctionner dans Vue3 :
<ul id="list"> <li v-for="t in dataArray"> {{t}} </li> </ul> <script> var numbers = [1,2,3]; //this is my external array var app = Vue.createApp({ data() { return { dataArray : numbers } } //bind Vue to my external array }).mount("#list"); numbers.push(4); //UI not updating, but worked fine in Vue2 </script>
Je sais que je peux appeler app.dataArray.push
来代替,或者调用 $forceUpdate
etc, mais existe-t-il un moyen de forcer Vue à simplement regarder le tableau existant ?
Je suppose que la question plus large est la suivante : comment lier Vue3 à des objets JS purs arbitraires ? L'objet est peut-être trop complexe pour être remplacé ou il peut provenir d'une API externe sur laquelle je n'ai aucun contrôle. C'est simple dans Vue2 ou Angular (liaison bidirectionnelle à n'importe quel objet normal, qu'il fasse partie d'une instance/composant ou non)
P.S. Cela ressemble à un énorme changement radical dans Vue3, mais il n'est mentionné nulle part.
Mise à jour :
D'après la réponse de @Dimava, il semble que le moyen le moins pénible de corriger le code ci-dessus est :
var numbers = [1,2,3]; //this is my external array numbers = Vue.shallowReactive(numbers); //convert to a reactive proxy
Vous devez réaliser votre tableau
Reactive
11 (ou
ShallowReactive
s'il contient beaucoup d'objets volumineux qui ne devraient pas répondre pour des raisons de performances)