Pouvez-vous forcer la Vue.js pour recharger/re-rendre?
9 réponses
Essayez ce sort magique:
vm.$forceUpdate();
Pas besoin de créer des vars suspendus:)
Update: j'ai trouvé cette solution quand j'ai seulement commencé à travailler avec VueJS. Cependant, une exploration plus poussée a prouvé cette approche comme une béquille. Pour autant que je me souvienne, dans un moment, je me suis débarrassé de cela en mettant simplement toutes les propriétés qui n'ont pas réussi à s'actualiser automatiquement (la plupart du temps imbriquées) dans des propriétés calculées.
Plus d'infos ici: https://vuejs.org/v2/guide/computed.html
Cela semble assez propre solution de matthiasg sur cette question:
Vous pouvez également utiliser
:key="someVariableUnderYourControl"
et changer la clé lorsque vous souhaitez que le composant soit complètement reconstruit
Pour mon cas d'utilisation, je nourrissais un getter Vuex dans un composant en tant qu'accessoire. D'une manière ou d'une autre, Vuex récupérerait les données, mais la réactivité ne serait pas fiable pour rediriger le composant. Dans mon cas, définir le composant key
sur un attribut sur l'accessoire garantissait une actualisation lorsque les getters (et l'attribut) ont finalement résolu.
Utilisez vm.$set('varName', value)
. Recherchez les détails dans Change_Detection_Caveats .
Pourquoi?
...ne vous besoin pour forcer une mise à jour?
Peut-être que vous n'explorez pas Vue à son meilleur:
Avoir Vue automatiquement réagir aux modifications de la valeur, les objets doivent être initialement déclaré dans
data
. Ou, sinon, ils doivent être ajoutés en utilisantVue.set()
.
Voir les commentaires dans la démo ci-dessous. Ou ouvrez la même démo dans un JSFiddle ici.
new Vue({
el: '#app',
data: {
person: {
name: 'Edson'
}
},
methods: {
changeName() {
// because name is declared in data, whenever it
// changes, Vue automatically updates
this.person.name = 'Arantes';
},
changeNickname() {
// because nickname is NOT declared in data, when it
// changes, Vue will NOT automatically update
this.person.nickname = 'Pele';
// although if anything else updates, this change will be seen
},
changeNicknameProperly() {
// when some property is NOT INITIALLY declared in data, the correct way
// to add it is using Vue.set or this.$set
Vue.set(this.person, 'address', '123th avenue.');
// subsequent changes can be done directly now and it will auto update
this.person.address = '345th avenue.';
}
}
})
/* CSS just for the demo, it is not necessary at all! */
span:nth-of-type(1),button:nth-of-type(1) { color: blue; }
span:nth-of-type(2),button:nth-of-type(2) { color: red; }
span:nth-of-type(3),button:nth-of-type(3) { color: green; }
span { font-family: monospace }
<script src="https://unpkg.com/vue"></script>
<div id="app">
<span>person.name: {{ person.name }}</span><br>
<span>person.nickname: {{ person.nickname }}</span><br>
<span>person.address: {{ person.address }}</span><br>
<br>
<button @click="changeName">this.person.name = 'Arantes'; (will auto update because `name` was in `data`)</button><br>
<button @click="changeNickname">this.person.nickname = 'Pele'; (will NOT auto update because `nickname` was not in `data`)</button><br>
<button @click="changeNicknameProperly">Vue.set(this.person, 'address', '99th st.'); (WILL auto update even though `address` was not in `data`)</button>
<br>
<br>
For more info, read the comments in the code. Or check the docs on <b>Reactivity</b> (link below).
</div>
Pour maîtriser cette partie de Vue, consultez les documents officiels surréactivité - Modification des mises en garde de détection . Il est un must lire!
Essayez d'utiliser this.$router.go(0);
manuellement recharger la page en cours.
J'ai trouvé un moyen. C'est un peu hacky mais fonctionne.
vm.$set("x",0);
vm.$delete("x");
Où vm
est votre objet view-model, et x
est une variable inexistante.
Vue.js se plaindra de cela dans le journal de la console, mais il déclenche une actualisation pour toutes les données. Testé avec la version 1.0.26.
Vous pouvez forcer le rendu de L'interface utilisateur: ce.$forceUpdate ();
Utilisation de la directive v-if
<div v-if="trulyvalue">
<component-here />
</div>
Donc, simplement en changeant la valeur de trulyvalue de false à true, le composant entre le div sera à nouveau redirigé
Bien sûr .. vous pouvez simplement utiliser l'attribut key pour forcer le rendu (récréation) à tout moment.
<mycomponent :key="somevalueunderyourcontrol"></mycomponent>
Voir https://jsfiddle.net/mgoetzke/epqy1xgf/ par exemple
, Il a également été discuté ici: https://github.com/vuejs/Discussion/issues/356#issuecomment-336060875