如何在 Nuxt.js 应用程序的 Vuex 商店中设置值
How to set values in Vuex store in Nuxt.js app
我从来没有用过Vuex
和Nuxt.js
,所以我遇到了这个问题。这是我的 store/index.js
文件:
export const state = () => ({
wrongCredentials: false,
logged: false,
uxd: null
})
export const mutations = {
setWrongCredentials(state, value) {
state.wrongCredentials = value
},
setLogged(state, value) {
state.logged = value
},
setUxd(state, value) {
state.uxd = value
},
}
如您所见,存在状态和突变。在我的另一个文件中,我在其中检查用户的 JWT 令牌,并根据结果 M 我想在商店中设置值:
import jwt from 'jsonwebtoken'
import cert from '../jwt/public'
export default {
verify (token) {
jwt.verify(token, cert, async (err, decoded) => {
if (err) {
this.$store.state.wrongCredentials = true
this.$store.state.logged = false
this.$store.state.uxd = null
} else {
this.$store.state.wrongCredentials = false
this.$store.state.logged = true
this.$store.state.uxd = decoded.uxd
}
})
}
}
您看到的代码无法正常工作,它只是没有设置值,所以,我创建了突变并做了如下操作:
await this.$store.dispatch('setWrongCredentials', true)
同样无效。问题是,我不知道如何使用 Vuex
store not in .vue
files,所以,我如何在 store 中设置值?
不幸的是,我没有在 .js
文件中找到我想要的这个问题的解决方案,所以,这是另一个解决方案。
首先,您不仅需要设置状态和突变,还需要设置动作:
export const actions = {
fetchWrongCredentials(ctx, value) {
ctx.commit('setWrongCredentials', value)
},
fetchLogged(ctx, value) {
ctx.commit('setLogged', value)
},
fetchUxd(ctx, value) {
ctx.commit('setUxd', value)
}
}
并且在您的 Vue
组件中,您需要使用操作在状态中设置值,就像这样:
methods: {
...mapActions(['fetchWrongCredentials', 'fetchLogged', 'fetchUxd']),
async login() {
await login({
password: this.userPassword,
login: this.userLogin,
twoFactor: this.twoFactor
}).then(result => {
const jwtRes = jwt.verify(result.token)
this.fetchLogged(true)
this.fetchWrongCredentials(false)
this.fetchUxd(jwtRes.token)
}).catch(() => {
this.fetchLogged(false)
this.fetchWrongCredentials(true)
this.fetchUxd(null)
this.error = true
setTimeout(() => {
this.error = false
}, 1000)
})
}
}
就我而言,我必须修改 .js
文件:
import jwt from 'jsonwebtoken'
import cert from '../jwt/public'
export default {
verify (token) {
return jwt.verify(token, cert, (err, decoded) => {
if (err) {
return false
} else {
return { token: decoded.uxd }
}
})
}
}
我从来没有用过Vuex
和Nuxt.js
,所以我遇到了这个问题。这是我的 store/index.js
文件:
export const state = () => ({
wrongCredentials: false,
logged: false,
uxd: null
})
export const mutations = {
setWrongCredentials(state, value) {
state.wrongCredentials = value
},
setLogged(state, value) {
state.logged = value
},
setUxd(state, value) {
state.uxd = value
},
}
如您所见,存在状态和突变。在我的另一个文件中,我在其中检查用户的 JWT 令牌,并根据结果 M 我想在商店中设置值:
import jwt from 'jsonwebtoken'
import cert from '../jwt/public'
export default {
verify (token) {
jwt.verify(token, cert, async (err, decoded) => {
if (err) {
this.$store.state.wrongCredentials = true
this.$store.state.logged = false
this.$store.state.uxd = null
} else {
this.$store.state.wrongCredentials = false
this.$store.state.logged = true
this.$store.state.uxd = decoded.uxd
}
})
}
}
您看到的代码无法正常工作,它只是没有设置值,所以,我创建了突变并做了如下操作:
await this.$store.dispatch('setWrongCredentials', true)
同样无效。问题是,我不知道如何使用 Vuex
store not in .vue
files,所以,我如何在 store 中设置值?
不幸的是,我没有在 .js
文件中找到我想要的这个问题的解决方案,所以,这是另一个解决方案。
首先,您不仅需要设置状态和突变,还需要设置动作:
export const actions = {
fetchWrongCredentials(ctx, value) {
ctx.commit('setWrongCredentials', value)
},
fetchLogged(ctx, value) {
ctx.commit('setLogged', value)
},
fetchUxd(ctx, value) {
ctx.commit('setUxd', value)
}
}
并且在您的 Vue
组件中,您需要使用操作在状态中设置值,就像这样:
methods: {
...mapActions(['fetchWrongCredentials', 'fetchLogged', 'fetchUxd']),
async login() {
await login({
password: this.userPassword,
login: this.userLogin,
twoFactor: this.twoFactor
}).then(result => {
const jwtRes = jwt.verify(result.token)
this.fetchLogged(true)
this.fetchWrongCredentials(false)
this.fetchUxd(jwtRes.token)
}).catch(() => {
this.fetchLogged(false)
this.fetchWrongCredentials(true)
this.fetchUxd(null)
this.error = true
setTimeout(() => {
this.error = false
}, 1000)
})
}
}
就我而言,我必须修改 .js
文件:
import jwt from 'jsonwebtoken'
import cert from '../jwt/public'
export default {
verify (token) {
return jwt.verify(token, cert, (err, decoded) => {
if (err) {
return false
} else {
return { token: decoded.uxd }
}
})
}
}