Redux只是被吹捧的全局状态吗?
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; }
这仍然是通过发出动作来变化的全局状态树,但非常简单和高效。