Redux只是被吹捧的全局状态吗?

29 浏览
0 Comments

Redux只是被吹捧的全局状态吗?

我一周前开始学习React,自然而然地遇到了状态的问题,以及组件如何与应用程序的其他部分进行通信。我进行了搜索,Redux似乎是当下的热门选择。我阅读了所有的文档,我认为这实际上是一个相当革命性的想法。以下是我的一些想法:

状态通常被认为是非常麻烦和编程中错误的主要源头。Redux提出了一个有趣的想法:为什么不将所有状态集中在一个全局状态树中,然后只需通过发出动作来改变它?所有的程序都需要状态,所以让我们将它放在一个非纯净的空间中,并且只能从其中进行修改,这样错误就很容易追踪。然后,我们还可以将单个状态片段声明性地绑定到React组件上,并且它们会自动重新绘制,一切都很美好。

然而,我对这个整体设计有两个问题。首先,为什么状态树需要是不可变的?假设我不关心时间旅行调试、热重载,并且已经在我的应用程序中实现了撤销/重做。这样做似乎非常繁琐:

case COMPLETE_TODO:
  return [
    ...state.slice(0, action.index),
    Object.assign({}, state[action.index], {
      completed: true
    }),
    ...state.slice(action.index + 1)
  ];

而不是这样:

case COMPLETE_TODO:
  state[action.index].completed = true;

更不用说,我正在制作一个在线白板只是为了学习,每次状态改变可能只是简单地将一笔刷画添加到命令列表中。随着时间的推移(数百笔刷画),复制整个数组可能会变得非常昂贵和耗时。

我对于一个独立于UI的全局状态树通过动作进行变化还可以接受,但它真的需要是不可变的吗?使用这样简单(非常初步的草稿,在1分钟内编写的)的实现有什么问题呢?

var store = { items: [] };
export function getState() {
  return store;
}
export function addTodo(text) {
  store.items.push({ "text": text, "completed", false});
}
export function completeTodo(index) {
  store.items[index].completed = true;
}

这仍然是通过发出动作来变化的全局状态树,但非常简单和高效。

0