在 vue/vuex(/flux?) 中使用 ES6 类 是一种反模式吗?

Is using ES6 classes in vue/vuex(/flux?) an anti-pattern?

我一直在使用 Vuex,它坚持只通过 mutatorsactions 改变状态,这让我觉得你的商店应该只包含尽可能扁平的对象,只有基元类型。

有些线程甚至规定对您的数据进行规范化(因此您拥有带有 id 数组的对象来指示树关系,而不是嵌套对象树)。这可能与您的 JSON api.

非常匹配

这让我认为在您的通量存储中存储 classes(可能有 改变自身的方法 )是一种反模式。事实上,即使将您商店的数据混合到 class 中,您似乎也在逆潮流而行,除非您的 class 不对其内部数据执行任何修改。

这让我开始思考,在 Vue/Vuex/Reactive/Flux 中使用 any class 是反模式吗?

这些库似乎明确设计用于处理普通 JS 对象,而您与 API(数据输入、数据输出)的一般交互让我觉得更实用的方法(无不变性)才是最初的设计者正在考虑。

编写从 function => test => state mutator wrapper around function 运行的代码似乎也更容易。

我知道 JS 对象和 JS classes 的行为非常相似(并且基本上是同一件事),但我的逻辑是如果你 不使用 [=42= 进行设计]记住,那么你更有可能不会用非通量状态改变污染你的状态

社区是否普遍认为您的 flux 代码应该更实用,更少面向对象?

是的。你的想法是绝对正确的。像 ReduxVuex 这样的状态容器应该保存你的数据结构而不是函数。 JavaScript 中的函数确实只是可调用的对象。您也可以在函数上存储静态数据。但这仍然不符合纯数据的条件。也是出于同样的原因,我们没有将 Symbols 放入我们的状态容器中。

回到 ES 类,只要您使用 类 作为 POJO,即仅存储数据,您就可以自由使用它们。但是,如果您可以拥有简单的普通对象,为什么还要 类。

从 UI 组件中分离数据并将其移动到状态容器中具有函数式编程的基础。大多数严格的函数式语言,如 Haskell、Elm、OCaml 甚至 Elixir/Erlang 都是这样工作的。这为您的应用程序中的数据流提供了强有力的推理。此外,在这些语言中,数据是不可变的,这一点得到了补充。并且,因此没有像构造这样的有状态 Class 的地方。

JavaScript 由于事物本质上是可变的,因此界限有点模糊,很难定义好的做法。

最后,作为一个社区,对于使用函数式方式并没有明确的共识,但社区似乎正在朝着更函数式、无状态的组件方式发展。一些很好的例子是:

现在,即使我们在 VueReact 中都有功能组件。