【发布时间】:2019-09-11 07:52:47
【问题描述】:
我有一个创建用户页面。当我点击创建用户按钮时它工作正常,它会创建新用户并将我重定向到显示所有用户的页面。但我注意到,为了在此处(在显示所有用户的页面中)看到最后一个用户(刚刚创建的用户),我需要刷新页面。
这里是代码,在 createUser.vue:
methods: {
onSubmit() {
const userData = {
username: this.form.username,
email: this.form.email,
password: this.form.password
}
try {
this.userData = createUser(userData)
this.$message('User created!')
this.$router.push({
path: '/users-list'
})
} catch (err) {
console.log('Error in creating user: ', err)
}
}
}
并且在 users-list.vue 中:
created() {
this.$store.dispatch('user/setUsers')
const users = this.$store.getters.users
this.users = users
console.log("ALL USERS WITH GET PROFILE IN LISTA: ", users)
console.log('store in lista utenti: ', this.$store.state)
this.totalRows = this.users.length
},
有没有办法在渲染之前刷新推送的路由? 我缺少任何生命周期挂钩吗?
或者也许使用手表来发现 users 的更改状态(在商店中包含所有创建的用户)?
我目前正在检查这个解决方案,因为它似乎最适合我,但如果我遗漏了有关生命周期挂钩的一些内容,这个选项可能会很好。
如果有人在我之前有答案,请分享:) 谢谢 x
更新
我回到这个问题,我认为最好的方法是@ambianBeing createUser().then(res => /*do stuff*/) do stuff = ?
所以,在用户模块中,我创建了一个新的突变和一个新的动作(在 then() 内部调度的那个 - 在推送新路由之前)
.then(() => {
....
this.$store.dispatch('user/addUser')
this.$router.push({...})
})
)。
将刚刚创建的用户推送到 users 数组的突变是:
ADD_USER: (state, user) => {
state.users = [user, ...state.users]
},
而提交这个突变的动作是:
addUser({ commit }, users){
commit('ADD_USER', users)
},
但是我刚刚创建的用户未定义,这里是console.log:
ALL USERS WITH GET PROFILE IN USERS LIST: (18) [undefined, {…}, {…}, {…}, {…}, {…}]
我也在提交中尝试了用户而不是用户,但它也不起作用。
有人知道怎么帮忙吗? 谢谢
【问题讨论】:
-
createUser(userData)是否解决了一个承诺?执行users-list.vue的created()钩子时可能没有完成。你也可以尝试使用beforeMount生命周期钩子。 -
是的,axios 总是返回承诺。这里是 api 调用的代码:
export function createUser(userData) { const bodyFormData = new FormData(); bodyFormData.set('username', userData.username); bodyFormData.set('email', userData.email); bodyFormData.set('password', userData.password); return request({ url: '/users/', method: 'post', data: bodyFormData }) }根据我的阅读,不强烈推荐 beforeMount,但我会尝试。谢谢 -
我尝试了 beforeMount 并且在控制台中看起来更好:
ALL USERS WITH GETTERS IN USERS_LIST: (23) [{…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, {…}, SETUSERS RESPONSE: (24) [{…}, {…},最后一个是 api 调用的响应(与最后一个用户正确),第一个是获取用户状态商店,尚未更新。 -
@fdR 因为
createUser是一个axios 调用/承诺,为什么不更新存储并在解决createUser().then(res => /*do stuff*/)之后推送路由。另请注意:如果 dom 直接依赖于数据(获取或存储)created hook 是要走的路。 -
@ambianBeing 是对的。但是,您也可以使用
computed属性来监听更改。
标签: vuejs2 vue-router lifecycle page-refresh