【问题标题】:Why is view not getting updated after store state updates ? Vue js为什么商店状态更新后视图没有更新? Vue.js
【发布时间】:2020-12-18 19:50:24
【问题描述】:

几周前我开始使用 vue js 构建应用程序。 我想要做的是构建一个用户登录的应用程序。 我使用一个函数将我从后端获得的令牌存储在本地存储中,然后这些函数检查令牌是否仍然有效。没问题,它工作得很好。 然后我想使用 vuex,这样我就可以从应用程序的任何地方获取用户的状态(登录或未登录)。现在,我被困了几个小时,就像状态改变后视图没有更新一样。我需要刷新我的页面才能真正看到正确的信息。 我在互联网上寻找这个问题,我知道有一个 vue.set,但我的理解是它只能应用于对象?

请在下面找到代码:我知道它看起来没有意义,我只是在屏幕上显示很多变量来构建我的应用程序:我正在显示当前令牌,它的检查结果是只是为了测试目的。 这里的问题是当状态改变时它不会得到更新,但是当我不使用 vuex 时它曾经工作过,具有计算的属性和方法:

在我的组件中

<p>Current token : {{ tokenToCheck }}</p>
    <p>{{ isValid }}</p>
    <p>{{ loggedIn }}</p>
    <p> {{ test }} </p>
    <div class="alert alert-success" v-if="loggedIn"><p>You are logged in</p></div>

store.js

import Vue from 'vue'
import Vuex from 'vuex'
import jwt from 'jsonwebtoken'

Vue.use(Vuex);

export const store = new Vuex.Store({
    state: {
        tokenToCheck: localStorage.getItem('token'),
        isValid: 'test',
        isLogged: true
    }, 
    getters: {
        isLogged: (state) => {
            return state.isLogged; 
        }
    },
    mutations: {
        CHECK_TOKEN(state) {
            try{
                jwt.verify(state.tokenToCheck, 'RANDOM_TOKEN');
                state.isValid = 'ok';
                state.isLogged = true;
                return true;
            } catch(error) {
                console.log(error);
                console.log(state.tokenToCheck);
                console.log('erreur test token'); 
                state.isValid = "expiry"; 
                state.isLogged = false;
                return false;
            }
        }
    }
});

在我的组件中计算

export default {

  name: 'Home',
  data() {
    return {
      pseudo: '', 
      test: localStorage.getItem('token'), 
      password: '', 
      errorMessage:'',
      token: '',
      isAlert: false
    }
  },
  computed: {
    loggedIn() {
      return this.$store.getters.isLogged; 
    }, 
    isValid(){
      return this.$store.state.isValid;
    },
    tokenToCheck() {
      return this.$store.state.tokenToCHeck;
    }
  },
  mounted() {
    this.$store.commit('CHECK_TOKEN');
  },

Ps:我在控制台中没有收到任何错误,并且密钥不是帖子中的内容:)

【问题讨论】:

    标签: javascript vue.js vuejs2 vue-component vuex


    【解决方案1】:

    提交应该由方法触发或在生命周期钩子内触发,建议使用计算属性获取存储状态,在组件脚本中你应该有:

    computed:{
      loggedIn() {
          return this.$store.getters.isLogged; 
        },
      isValid(){
        return this.$store.state.isValid
       },
      getTokenToCheck(){
         return  this.$store.state.tokenToCheck
      }
    },
    
    mounted(){
    this.$store.commit('CHECK_TOKEN') 
    }
    

    模板会是这样的:

    <p>Current token : {{ getTokenToCheck }}</p>
    <p>{{isValid }}</p>
    <p>{{ loggedIn }}</p>
    
    <div class="alert alert-success" v-if="loggedIn"><p>You are logged in</p></div>
    

    【讨论】:

    • 感谢您的回答!!我做了更改,但它仍然无法正常工作。现在,tokenToCheck 不再显示在视图上,但实际上已经完成了测试。我仍然需要手动刷新页面以获取更改...我更新了帖子上的代码。再次感谢您
    • 我认为问题出在非响应式本地存储
    • 但是既然我在商店里拿到了存储,它应该可以工作吗?
    • 它可以工作但它不是响应式的,本地存储中的值已更新但未显示在视图中
    • 好的,我找到了一个名为 vue-storage-watcher 的插件,它可以工作吗?你知道吗?
    【解决方案2】:

    好的,有兴趣的朋友:

    我使用了 vue-storage-watcher npm 插件。

    看起来它正在工作,但如果更有经验的开发人员有其他方法可以做到这一点,我仍然愿意。

    再次感谢

    【讨论】:

    • 您应该解释为什么以及如何使用它来使答案对未来的提问者有所帮助
    猜你喜欢
    • 2019-08-29
    • 1970-01-01
    • 1970-01-01
    • 2021-08-04
    • 1970-01-01
    • 2011-07-30
    • 1970-01-01
    • 2019-11-06
    相关资源
    最近更新 更多