我的问题是,当我从一个用户页面转到另一个用户页面时,组件中的信息仍然保留在第一个用户那里。因此,如果我从/user/username1
转到/user/username2
,则信息仍保留在username1
中。我怎样才能解决这个问题 ?这是我的代码:
UserProfile.vue
mounted() {
this.$store.dispatch('getUserProfile').then(data => {
if(data.success = true) {
this.username = data.user.username;
this.positive = data.user.positiverep;
this.negative = data.user.negativerep;
this.createdAt = data.user.createdAt;
this.lastLogin = data.user.lastLogin;
data.invites.forEach(element => {
this.invites.push(element);
});
}
});
},
这是从actions.js
文件中获得的user
:
const getUserProfile = async ({
commit
}) => {
try {
const response = await API.get('/user/' + router.currentRoute.params.username);
if (response.status === 200 && response.data.user) {
const data = {
success: true,
user: response.data.user,
invites: response.data.invites
}
return data;
} else {
return console.log('Something went wrong.');
}
} catch (error) {
console.log(error);
}
};
是否应该添加watch
而不是mounted
来跟踪URL中username
的更改?
答案 0 :(得分:1)
您可以将watch
与immediate
属性一起使用,然后可以删除mounted
中的代码,因为将改为调用监视处理程序。
watch: {
'$route.params.username': {
handler: function() {
this.$store.dispatch('getUserProfile').then(data => {
if(data.success = true) {
this.username = data.user.username;
this.positive = data.user.positiverep;
this.negative = data.user.negativerep;
this.createdAt = data.user.createdAt;
this.lastLogin = data.user.lastLogin;
data.invites.forEach(element => {
this.invites.push(element);
});
}
});
},
deep: true,
immediate: true,
},
}
答案 1 :(得分:0)
您的页面似乎是在检索数据之前加载的,您需要在数据中放置一个“ loading”属性,并为组件添加一个v-if="!loading"
,它只有在更新显示后才会呈现。就我个人而言,如果可以的话,我会避免观看,因为它对细粒度处理的性能不利。
答案 2 :(得分:0)
是的,您应该在包含用户信息的语句上添加wach(您可能在观察对象时遇到问题,因此可以将用户信息保存在json中,但不确定)。当用户更改-呼叫操作时,在获得应更改状态的响应呼叫突变后,请观察该状态。
您可能会使用更好的语法从存储接收数据。直接从分叉的钩子调用调度确实是一个坏主意,请使用vuex文档使您的代码更好。