代码之家  ›  专栏  ›  技术社区  ›  Mathieu Mourareau

Vuex更新状态

  •  0
  • Mathieu Mourareau  · 技术社区  · 4 年前

    我的AXIOS请求可以返回对象或空集合,我想随时更新我的UsSerDayLIY项目。我控制台记录我的变异和getter,这是可行的,但对于localStorage项的更新,这是错误的。我得到的结果

    我做错什么了?

    我的行动是:

    updateUserDailyFoods(context, data) {
    
              let date = data.data
    
              if(date){
                  axios
                      .get(`/user/daily/food/${context.getters.user.id}/${date}/`)
                      .then(r => {
                          context.commit('userDailyFoods', {userDailyFoods: r.data.data});
                          localStorage.setItem('userDailyFoods', JSON.stringify(r.data.data));
                      })
                      .catch(e => {
                          console.log(e)
                      })
              }
    
    
              console.log(localStorage.getItem('userDailyFoods'));
          }
    

    userDailyFoods (state, payload) {
        if(payload) {
            state.userDailyFoods = payload.userDailyFoods
        }
    },
    

    吸气剂:

    userDailyFoods(state){
          return state.userDailyFoods
      }
    

    状态:

    userDailyFoods: JSON.parse(localStorage.getItem('userDailyFoods')) || [],
    

    当我转到我的视图组件时

        computed: {
                userDailyFoods(){
                    return this.$store.state.userDailyFoods
                },
    }
    

    我会记录我的行为:

    console.log(this.userDailyFoods)
    

    然后,在两次单击后更新结果,而不是只单击一次

       getDaySelected(day){
                        var day = moment(day).format('YYYY-MM-DD');
                        this.$store.dispatch('updateUserDailyFoods', {data: day})
                        console.log(this.userDailyFoods)
                        this.$parent.$data.foods = this.userDailyFoods
    
                    }
    
    1 回复  |  直到 4 年前
        1
  •  1
  •   Dan    4 年前

    (按要求回答)值可能每次都在本地存储中设置,但在AsiaC AXIOS操作完成之前,您尝试对其进行日志记录。移动 console.log 进入 then

    .then(r => {
        context.commit('userDailyFoods', {userDailyFoods: r.data.data});
        localStorage.setItem('userDailyFoods', JSON.stringify(r.data.data));
        console.log(localStorage.getItem('userDailyFoods'));
    })
    

    Axios(通常是Ajax)是异步的,这意味着操作开始与代码的正常同步流分开。在它开始之后,程序执行会立即恢复,通常在异步操作完成之前。当您登录到控制台时,还不能保证这个异步承诺已经得到解决。

    作为旁白,不需要那个getter,您可以认为它是一个不计算任何东西的计算。