在 nuxt 上更改路由后没有销毁页面
didnt destroyed the page after change the route on nuxt
我的页面上有一个简单的页面 我有一个调用 api 的函数。当我改变页面时这个功能并没有消失,它再次调用api方法
我的函数
async getFlights() {
try {
const { data } = await this.$axios.get(
`/api/v1/flights/${this.flightIndexResponse.index}`,
);
this.filterResult = [];
this.loadingFlights = false;
this.flightResponse = data?.data?.items;
} catch (e) {
if (e?.response?.data?.code === 418 && this.teapotErrorCounter < 10) {
setTimeout(() => {
this.getFlights();
}, 2000);
} else {
this.reponseStatus = false;
this.flightResponse = [];
this.reponseStatus = false;
this.loadingFlights = false;
}
}
}
当服务器响应状态代码 418 时。这个功能再次 运行 。当我改变路线时没有破坏功能
setTimeout
函数将回调执行添加到不同的队列中,以便进程稍后执行。
因此,即使您更改页面并且组件被销毁,setTimeout
回调仍然存在(所有代码仍然加载,只是 Vue 组件实例消失了)
这里有几种可能的解决方案,但我建议您取消页面更改时的 setTimeout。
vue-router
公开了几个钩子(称为 navigation guards)来监听页面变化:
retryTimeout: null,
[...]
if (e?.response?.data?.code === 418 && this.teapotErrorCounter < 10) {
this.retryTimeout = setTimeout(() => {
this.getFlights();
}, 2000);
}
[...]
beforeRouteLeave() {
// when leaving the page
clearTimeout(this.retryTimeout)
}
我的页面上有一个简单的页面 我有一个调用 api 的函数。当我改变页面时这个功能并没有消失,它再次调用api方法
我的函数
async getFlights() {
try {
const { data } = await this.$axios.get(
`/api/v1/flights/${this.flightIndexResponse.index}`,
);
this.filterResult = [];
this.loadingFlights = false;
this.flightResponse = data?.data?.items;
} catch (e) {
if (e?.response?.data?.code === 418 && this.teapotErrorCounter < 10) {
setTimeout(() => {
this.getFlights();
}, 2000);
} else {
this.reponseStatus = false;
this.flightResponse = [];
this.reponseStatus = false;
this.loadingFlights = false;
}
}
}
当服务器响应状态代码 418 时。这个功能再次 运行 。当我改变路线时没有破坏功能
setTimeout
函数将回调执行添加到不同的队列中,以便进程稍后执行。
因此,即使您更改页面并且组件被销毁,setTimeout
回调仍然存在(所有代码仍然加载,只是 Vue 组件实例消失了)
这里有几种可能的解决方案,但我建议您取消页面更改时的 setTimeout。
vue-router
公开了几个钩子(称为 navigation guards)来监听页面变化:
retryTimeout: null,
[...]
if (e?.response?.data?.code === 418 && this.teapotErrorCounter < 10) {
this.retryTimeout = setTimeout(() => {
this.getFlights();
}, 2000);
}
[...]
beforeRouteLeave() {
// when leaving the page
clearTimeout(this.retryTimeout)
}