created und watch
Ein typisches Vue-Router-Szenario: Daten müssen initialisiert und bei Routen-Updates zurückgesetzt und geladen werden, da die Komponente nicht neu erzeugt sondern nur intern aktualisiert wird.
data () {
return {
user: null,
loading: true
}
},
created () {
this.fetchData()
},
watch: {
'$route': 'fetchData'
},
methods: {
async fetchData () {
this.loading = true
this.user = await this.$network.getUser(this.$route.params.userId)
this.loading = false
}
}
Watchers und immediate: true
Die Dopplung in created und watch kann durch einen Watcher mit der Eigenschaft immediate eliminiert werden:
watch: {
'$route': {
handler: 'fetchData',
immediate: true
}
}
Neuladen statt Updaten
Zudem kann man ein Neu-Rendern der Komponente bei Routen-Änderung erzwingen, um die Unübersichtlichkeit und das Fehlerpotential eines Updates zu vermeiden.
data () {
return {
user: null,
loading: true
}
},
async created () {
this.loading = true
this.user = await this.$network.getUser(this.$route.params.userId)
this.loading = false
}
Hierfür muss im Template, welches den Router-View einfügt, einfach ein Key übergeben werden, der idealerweise die gesamte URL darstellt:
<router-view :key="$route.fullPath" />