Pouvez-vous forcer la Vue.js pour recharger/re-rendre?

Juste une question rapide.

Pouvez-vous forcer Vue.js pour recharger / recalculer tout? Si oui, comment?

95
demandé sur Dave 2015-08-20 00:43:52

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

111
répondu Boris Mossounov 2017-02-10 14:33:25

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.

19
répondu Brian Kung 2018-02-12 20:44:22

Utilisez vm.$set('varName', value). Recherchez les détails dans Change_Detection_Caveats .

16
répondu denis.peplin 2016-07-03 18:41:22

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 utilisant Vue.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!

11
répondu acdcjunior 2018-04-28 14:30:02

Essayez d'utiliser this.$router.go(0); manuellement recharger la page en cours.

4
répondu PoyChang 2018-06-08 09:06:55

J'ai trouvé un moyen. C'est un peu hacky mais fonctionne.

vm.$set("x",0);
vm.$delete("x");

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.

2
répondu Laszlo the Wiz 2016-09-03 22:11:27

Vous pouvez forcer le rendu de L'interface utilisateur: ce.$forceUpdate ();

2
répondu Panayiotis Hiripis 2018-03-29 09:33:19

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é

1
répondu GEOFFREY MWANGI 2018-03-08 20:56:15

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

0
répondu mgoetzke 2018-08-18 14:34:06