【问题标题】:currentUser not getting set with VuexcurrentUser 没有使用 Vuex 设置
【发布时间】:2019-01-24 19:55:17
【问题描述】:

我在我的 vue 项目中添加了一些代码,以便我可以保存用户的状态——即他是否登录。如果状态不为空,我想显示导航栏和页脚。我添加了所有的 vuex 导入语句。我正在使用 axios 调用数据库,它返回一个 json response。 response.data 返回真/假。如果为真,我将用户重定向到主页。然后我创建了一个名为currentUser 的用户对象,但我不确定它的基础是什么,所以它被设置为null。我需要在整个应用程序的几个地方使用state,但它没有设置好。请有人帮忙。提前致谢。 (代码如下)

用户.js:


            import JwtDecode from 'jwt-decode'

        export default class User {
          static from (token) {
            try {
              let obj = JwtDecode(token)
              return new User(obj)
            } catch (_) {
              return null
            }
          }

          
              constructor ({username}) {
            this.username = username 
            
          }

        
        }

App.vue:

            <template>
          <div id="app">
            <template v-if="currentUser">
              <Navbar></Navbar>
            </template>
            <div class="container-fluid">
              <router-view></router-view>
              <template v-if="currentUser">
                <Foot></Foot>
              </template>
            </div>
          </div>
        </template>


        <script>
        import { mapGetters } from 'vuex'
        import Navbar from '@/components/Navbar'
        import Foot from '@/components/Foot'

        export default {

        name: 'App',
        components: {
          Navbar,
          Foot
        },
        computed: {
            ...mapGetters({ currentUser: 'currentUser' })
          },
  

mutation_types.js:

                        export const LOGIN = 'LOGIN'
                        export const LOGOUT = 'LOGOUT'

auth.js:

            /* global localStorage */

        import User from '@/models/User'
        import * as MutationTypes from './mutation_types'

        const state = {
          user: User.from(localStorage.token)
        }


        const mutations = {
            [MutationTypes.LOGIN] (state) {
              state.user = User.from(localStorage.token)
            },
            [MutationTypes.LOGOUT] (state) {
              state.user = null
            }
          }
          
          const getters = {
            currentUser (state) {
              return state.user
            }
          }
          
          const actions = {
            login ({ commit }) {
              commit(MutationTypes.LOGIN)
            },
          
            logout ({ commit }) {
              commit(MutationTypes.LOGOUT)
            }
          }
          
          export default {
            state,
            mutations,
            getters,
            actions
          }

【问题讨论】:

    标签: vuejs2 axios vuex


    【解决方案1】:

    用户存储应该只设置默认状态。在请求验证用户之后。您应该使用actions 和mutations 来设置用户状态。通过store.dispatch("user/login", user) 调用操作,返回new User(obj)。

        let obj = JwtDecode(token)
        const user = new User(obj)
        store.dispatch("user/login", user)
    
        const actions = {
                login ({ commit }, userObject) {
                  commit(MutationTypes.LOGIN, userObject)
                },
        
                logout ({ commit }) {
                  commit(MutationTypes.LOGOUT)
                }
        }
    
        const mutations = {
                [MutationTypes.LOGIN] (state, user) {
                  state.user = user;
                },
                [MutationTypes.LOGOUT] (state) {
                  state.user = null
                }
        }
    

    另一方面,你有愚蠢的吸气剂。这意味着他们只是返回状态。您可以直接在状态之外调用用户对象。如果您想在返回之前修改返回值,请使用 getter。

    【讨论】:

    • 我是 vuex 新手,不明白你的答案。您能否进一步说明如何保存状态以及更改的确切位置? (在哪些文件中)
    • 我建议您首先阅读所有 vuex 文档 (vuex.vuejs.org/guide) 和示例 (github.com/vuejs/vuex/tree/dev/examples),这样您可以获得更多上下文,然后我可以提供更好的帮助。
    • 好的,我浏览了文档和一些 vuex 教程。我在我的登录组件中验证用户,然后从那里分派login 操作?另外,我在创建 JWT 令牌以传递 state.user 时遇到问题,因为我的 axios 调用只返回一个 Json 布尔值......你是否建议我使用 LocalStorage.token,如果是,请详细说明......
    • 如果用户登录成功,您可以发送登录操作。此操作将检查用户是否有效。您可以在名为authentication 的登录状态上设置创建attribute。并根据您的登录操作结果将其设置为 true。 Axios 返回一个承诺,所以你应该在 axios 调用上异步/等待。然后返回值将在 data.results 中。有些人将 JWT 存储在本地存储中,而其他人将其存储在 cookie 中。我不喜欢将 JWT 存储在 state 中。但是在该状态下,我有一个身份验证属性。很少有文章对此进行详细说明
    • @JeremyWalters-谢谢!我设法设置了state。跳过创建 user 对象。刚刚发送了调用 login 突变的操作 - 将 state.authentication 设置为 true。使用this 答案获取状态以通过 js-cookie 和 vuex-persistedstate 持久化。
    【解决方案2】:

    我看了看,您似乎使用 '=' 而不是 Vue.set() 来设置您的状态变量。

    参考答案:vuex - is it possible to directly change state, even if not recommended?

    【讨论】:

    • 你能展示我如何将 Vue.set() 与一些代码一起使用吗?
    猜你喜欢
    • 2020-04-08
    • 2020-03-11
    • 2019-04-16
    • 2020-09-17
    • 2020-03-30
    • 1970-01-01
    • 2020-05-04
    • 1970-01-01
    • 2021-07-06
    相关资源
    最近更新 更多