【问题标题】:Vue 3 Vuex how can I force a callback function to run asynchronouslyVue 3 Vuex 如何强制回调函数异步运行
【发布时间】:2021-12-18 02:19:36
【问题描述】:

我将 Vuex 与 Vuex-persistantstorage 一起使用,并且我有一个表示应用程序模式的变量。当模式改变时,我想做几件事(让我们称之为 f()),比如打开侧边栏、改变路线等,其中一些事情会导致其他 Vuex 变量发生变化。

我尝试在 UI 元素和存储模式变量之间的计算属性中更改 f()。

我还尝试在模式变量上使用观察器并在那里进行其他更改 f()。

在所有情况下,我都会收到一个错误“不要在突变处理程序之外改变 Vuex 存储状态”。如果我删除了导致 Vuex 状态而不是模式更改的操作,那么问题就会消失。我对 Vues 变量的所有更改都在使用 store.commit 的突变处理程序中。

经过多次调试,似乎 f() 在模式更改时执行的响应式代码期间被同步调用,并且 Vuex 将所有 Vuex 变量视为一个大变量的一部分,以便在修改周期中修改到第二个 Vuex 变量第一个 Vuex 变量是一件坏事,因此会出错。

如何创建一个在 Vuex 变量的整个反应周期完成后执行的回调?

【问题讨论】:

  • 您能否提供一些代码,最好是触发错误的确切代码?否则,我们只是从对更复杂问题的模糊描述中猜测问题所在。
  • 我还在尝试在一个小例子中重现它。

标签: vue.js vuex vue-reactivity


【解决方案1】:

“不要在突变处理程序之外改变 Vuex 存储状态”

仅当您更改 Vuex 状态而不是从一个突变,或者如果突变以异步方式突变状态(即在突变函数返回之后)时,才会发生此错误。

我对 Vues 变量的所有更改都在使用 store.commit 的突变处理程序中

不过,显然状态是在突变之外发生突变。

经过多次调试,似乎 f() 在模式更改时执行的响应式代码期间被同步调用,并且 Vuex 将所有 Vuex 变量视为一个大变量的一部分,以便在修改周期中修改到第二个 Vuex 变量第一个 Vuex 变量是一件坏事,因此会出现错误。

不确定你的结论是否正确。何时调用 f() 无关紧要,只要状态突变在突变函数中同步发生即可。

如何创建一个在 Vuex 变量的整个反应周期完成后执行的回调?

这可能不是解决方案 (XY problem)。

如果您可以提供触发错误的状态突变发生的代码行,将会很有帮助。

【讨论】:

  • 我仍然无法用一个小例子重现它。我会继续努力。我已经在调试器中逐步完成了代码,它确实发生在提交函数内部。如果我删除观察者中的函数调用,它不会导致错误。我对 javascript 很陌生,调试它并不容易,因为我似乎永远在单步执行 vue 反应性代码。
  • 发生在提交函数内部?那时你不会得到那个错误,除非你在那里做一些异步的事情(在这种情况下你应该使用一个动作)。您使用的是fetchXMLHttpRequestsetTimeout 还是类似的东西?
  • 我永远无法在一个小应用程序中重现它。我最终改变了我做事的方式。
猜你喜欢
  • 2020-05-17
  • 1970-01-01
  • 2015-12-26
  • 2022-07-27
  • 2019-02-25
  • 2016-01-14
相关资源
最近更新 更多