Redux 不就是美化了全局状态吗?

2024-04-20

所以我一周前开始学习 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;
}

它仍然是一个通过发出的操作进行变异的全局状态树,但极其简单且高效。


Redux 不就是美化了全局状态吗?

当然如此。但这同样适用于您曾经使用过的每个数据库。最好将 Redux 视为内存数据库 - 您的组件可以反应性地依赖它。

不变性可以非常有效地检查是否有任何子树已被更改,因为它简化了身份检查。

是的,你的实现是高效的,但是每次以某种方式操作树时,整个虚拟 dom 都必须重新渲染。

如果您使用 React,它最终会针对实际 dom 进行比较并执行最少的批量优化操作,但完整的自顶向下重新渲染仍然效率低下。

对于不可变树,无状态组件只需检查它所依赖的子树是否与先前的值相比在身份上有所不同,如果是这样,则可以完全避免渲染。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Redux 不就是美化了全局状态吗? 的相关文章

随机推荐