state: { active: localStorage.getItem('active') || 0, token: localStorage.getItem('token') || '', userInfo: JSON.parse(localStorage.getItem('userInfo')) || {} }, mutations: { setActive(state, payload) { localStorage.setItem('active', state.active) state.active = payload }, setUserInfo(state, payload) { localStorage.setItem('token', state.token) localStorage.setItem('userInfo', JSON.stringify(payload)) state.userInfo = payload } }, actions: { asyncSetUserInfo(ctx, payload) { return new Promise((resolve, reject) => { ctx.commit('setUserInfo', payload) resolve() }) } },我想在执行asyncSetUserInfo结束之后再进行页面跳转,如何修改
时间: 2023-12-15 09:05:04 浏览: 127
你可以在调用 `asyncSetUserInfo` 方法时使用 `then` 方法,在异步操作完成后执行页面跳转。具体实现如下:
```
this.$store.dispatch('asyncSetUserInfo', payload)
.then(() => {
// 异步操作完成后执行页面跳转
this.$router.push('/home')
})
.catch(error => {
console.log(error)
})
```
在这个例子中,`asyncSetUserInfo` 方法返回了一个 Promise 对象,我们在调用该方法时使用 `then` 方法,指定异步操作完成后执行的回调函数。在回调函数中,我们可以使用 `$router.push` 方法进行页面跳转。如果异步操作出现了错误,则可以在 `catch` 方法中进行处理。
相关问题
state: { // 数据 active: localStorage.getItem('active') || 0, token: localStorage.getItem('token') || '', userInfo: JSON.parse(localStorage.getItem('userInfo')) || {} }, mutations: { // 改数据函数 setActive(state, payload) { localStorage.setItem('active', payload) state.active = payload }, setUserInfo(state, payload) { localStorage.setItem('token', payload.token) localStorage.setItem('userInfo', JSON.stringify(payload)) state.userInfo = payload } }, actions: { // 请求数据函数 asyncSetUserInfo(ctx, payload) { return new Promise((resolve, reject) => { ctx.commit('setUserInfo', payload) resolve() }) } },使用asyncSetUserInfo触发setuserinfo来修改state中的数据,store.dispatch('asyncSetUserInfo', res.data.data).then((res) => { console.log(2) router.push('/mine') })页面跳转后不能获取到state中的数据
根据你提供的代码,有以下几点问题:
1. `setActive` mutation 中的 `localStorage.setItem('active', payload)` 应该改为 `localStorage.setItem('active', state.active)`,因为只有在 mutation 中更新了 state 的值之后,才能正确地将新值存储到 localStorage 中。
2. `setUserInfo` mutation 中的 `localStorage.setItem('token', payload.token)` 应该改为 `localStorage.setItem('token', state.token)`,同样地,只有在 mutation 中更新了 state 的值之后,才能正确地将新值存储到 localStorage 中。
3. 在 `asyncSetUserInfo` action 中,你应该在 `resolve()` 之前调用 `ctx.commit('setUserInfo', payload)`,因为只有在 mutation 中更新了 state 的值之后,才能正确地将新值存储到 localStorage 中,并返回一个 Promise。
4. 在 `then` 方法中,应该先判断数据是否已经成功更新,才进行页面跳转。例如:
```javascript
store.dispatch('asyncSetUserInfo', res.data.data).then(() => {
console.log(2)
if (store.state.userInfo.token) { // 判断数据是否已经成功更新
router.push('/mine')
}
})
```
根据以上修改,你的代码应该是这样的:
```javascript
state: {
active: localStorage.getItem('active') || 0,
token: localStorage.getItem('token') || '',
userInfo: JSON.parse(localStorage.getItem('userInfo')) || {}
},
mutations: {
setActive(state, payload) {
localStorage.setItem('active', state.active)
state.active = payload
},
setUserInfo(state, payload) {
localStorage.setItem('token', state.token)
localStorage.setItem('userInfo', JSON.stringify(payload))
state.userInfo = payload
}
},
actions: {
asyncSetUserInfo(ctx, payload) {
return new Promise((resolve, reject) => {
ctx.commit('setUserInfo', payload)
resolve()
})
}
},
```
希望这些修改能够解决你的问题。
const user = localStorage.getItem('user') || ''; let userInfo = null; // console.log(user, 'user') if (user !== 'undefined') { userInfo = JSON.parse(user); } else { userInfo = undefined } // console.log(userInfo.access_token, 'userinfo'); const access_token = (userInfo && userInfo.access_token) || ''; config.headers.Authorization = 'Bearer' + ' ' + access_token;
这段代码的作用是从本地存储中获取用户信息,并将用户的 access_token 添加到请求头(config.headers.Authorization)中,以便进行身份验证。具体来说,代码首先从本地存储中获取用户信息(localStorage.getItem('user')),如果获取不到则将 user 设置为一个空字符串(|| '')。然后,代码判断 user 是否等于字符串 'undefined',如果不是则将 user 解析为 JSON 对象,并将解析结果赋值给 userInfo;否则将 userInfo 设置为 undefined。最后,代码通过 userInfo.access_token 来获取用户的 access_token,如果 userInfo 不存在或者 userInfo.access_token 不存在,则将 access_token 设置为一个空字符串(|| '')。最终,代码将 access_token 添加到请求头中,以便进行身份验证。
阅读全文