【问题标题】:Computed Property does not get updated when state changes状态更改时不会更新计算属性
【发布时间】:2019-11-09 05:56:20
【问题描述】:

我们正在尝试使用vuex 存储状态:loggedIn 检测一个人是否已登录。当我从操作中调用 API 服务时,它会在成功登录后调用 mutation 并更改状态中的数据:

loginSuccess(state, accessToken) {
    state.accessToken = accessToken;
    state.authenticating = false;
    state.loggedIn = true;
    console.log(state.loggedIn);
  }

console.log() 显示了该值,因此突变正在起作用。

在我的另一个组件中,我使用计算属性来监视使用 ...mapState() 的商店中的更改,并将该属性绑定到模板视图中:

computed: { 
    ...mapState('authStore',['loggedIn' ]);
  }

但视图永远不会根据计算的属性进行更新。我在控制台中使用 Vue 开发工具进行了检查。它显示状态变化。

我已经初始化了状态。

export const states = {
  loggedIn: false
};

我尝试过直接调用状态。

this.$store.state.authStore.loggedIn;

我尝试了不同的方法。

...mapState('authStore', { logging:'loggedIn' });
//or
...mapState('authStore',['loggedIn' ]);

另外,尝试了 watch: {} 钩子但没有工作。

有趣的是,状态的getter 总是显示undefined,但在开发工具中状态属性会发生变化。

不知道哪里出了问题,也不知道如何继续前进。

这里是devtoolsstate登录成功后的截图:

【问题讨论】:

标签: vuejs2 vuex


【解决方案1】:

这引起了我的注意:

export const states = {
  loggedIn: false
};

我怀疑你是在尝试像这样使用它:

const store = {
  states,
  mutations,
  actions,
  getters
}

这不起作用,因为它需要被称为state 而不是states。结果将是loggedIn 是无反应的并且具有初始值undefined。任何计算属性,包括存储的 getter,都不会在值更改时刷新。

无论我的理论是否正确,我建议在loginSucess的开头加上console.log(state.loggedIn);,以确认突变前的状态。

【讨论】:

  • 非常感谢@Skirtle 的解决方案。为此我们坚持了 2 天。 :D
  • 你的眼睛真的很敏锐!感谢您的回复。我自己也错过了。
  • 我注意到state 应该是单数:vuex.vuejs.org/api/#state。如果你使用 SSR(比如 Nuxt),你也不希望你的状态是一个返回对象的函数
  • @PaulMelero 我不确定你在说什么。我的回答已经说明它是state 而不是states。至于 SSR,这似乎与所提出的问题无关。
  • 你是对的。我没有在你的回答中看到这一点。 SSR 部分可能对其他人有用。
猜你喜欢
  • 1970-01-01
  • 2018-01-06
  • 2019-05-18
  • 1970-01-01
  • 2014-04-06
  • 1970-01-01
  • 2021-04-16
  • 2021-07-09
  • 1970-01-01
相关资源
最近更新 更多