Обновление компонента VueJs при изменении маршрута
есть ли способ повторно отобразить компонент при изменении маршрута? Я использую vue Router 2.3.0, и я использую тот же компонент в нескольких маршрутах. Он отлично работает в первый раз или если я перехожу к маршруту, который не использует компонент, а затем к тому, который делает. Я прохожу то, что отличается в реквизите, как так
{
name: 'MainMap',
path: '/',
props: {
dataFile: 'all_resv.csv',
mapFile: 'contig_us.geo.json',
mapType: 'us'
},
folder: true,
component: Map
},
{
name: 'Arizona',
path: '/arizona',
props: {
dataFile: 'az.csv',
mapFile: 'az.counties.json',
mapType: 'state'
},
folder: true,
component: Map
}
затем я использую реквизит для загрузки новой карты и новых данных, но карта остается такой же, как при ее первой загрузке. Я не знаю, что происходит. на.
компонент выглядит следующим образом:
data() {
return {
loading: true,
load: ''
}
},
props: ['dataFile', 'mapFile', 'mapType'],
watch: {
load: function() {
this.mounted();
}
},
mounted() {
let _this = this;
let svg = d3.select(this.$el);
d3.queue()
.defer(d3.json, `static/data/maps/${this.mapFile}`)
.defer(d3.csv, `static/data/stations/${this.dataFile}`)
.await(function(error, map, stations) {
// Build Map here
});
}
2 ответов
во-первых, вы не должны действительно называть mounted()
себя. Абстрактные вещи, которые вы делаете в mounted
в метод, который вы можете вызвать из mounted
. Во-вторых, Vue попытается повторно использовать компоненты, когда сможет, поэтому ваша основная проблема, вероятно, что mounted
запускается только один раз. Вместо этого вы можете попробовать использовать updated
или beforeUpdate
жизненный цикл событие.
const Map = {
data() {
return {
loading: true,
load: ''
}
},
props: ['dataFile', 'mapFile', 'mapType'],
methods:{
drawMap(){
console.log("do a bunch a d3 stuff")
}
},
updated(){
console.log('updated')
this.drawMap()
},
mounted() {
console.log('mounted')
this.drawMap()
}
}
здесь пример, не рисуя материал d3, но показывая, как mounted
и updated
обстреляны, когда вы меняете маршруты. Pop откройте консоль, и вы увидите mounted
запускается только один раз.
вы можете добавить атрибут :key в <router-view>
вот так:
<router-view :key="$route.fullPath"></router-view>
таким образом, маршрутизатор Vue перезагрузит компонент после изменения пути. Без ключа он даже не заметит, что что-то изменилось, потому что используется тот же компонент (в вашем случае компонент карты).