雷德克斯是不是光荣的全球状态?
所以我一周前开始学习React,我不可避免地遇到了状态问题,以及组件如何与应用程序的其他部分进行通信。 我四处搜寻,Redux似乎是本月的味道。 我阅读了所有的文档,我认为这实际上是一个非常革命性的想法。 这是我的想法:
一般认为国家是非常邪恶的,也是编程中的一个大错误。 Redux说,为什么不把它全部集中在一个全局状态树中,你必须发出改变的动作? 听起来不错。 所有的程序都需要状态,所以让我们把它粘在一个不纯的空间里,只是从里面修改它,所以错误很容易追踪。 然后,我们还可以声明性地将各个状态片段绑定到React组件,并让它们自动重绘,一切都很美丽。
不过,我对这个整个devise有两个问题。 首先,为什么状态树需要是不变的? 说我不在乎时间旅行debugging,热重载,并已经在我的应用程序中实现撤消/重做。 要做到这一点似乎很麻烦:
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;
更不用说,我正在制作一个在线白板来学习,每一个状态的改变都可以像在笔画列表中添加笔触一样简单。 经过一段时间(数百次笔触)复制整个arrays可能开始变得非常昂贵和耗时。
我确定一个全局状态树,它独立于通过动作变异的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作为内存数据库处理是最好的 – 您的组件可以react native地依赖这些数据库。
不变性使得能够检查是否有任何子树被改变非常有效,因为它简化了身份检查。
是的,你的实现是高效的,但是每次树被操纵的时候,整个虚拟宿主将不得不被重新渲染。
如果您使用的是React,它最终会对实际的dom进行差异化,并执行最小批量优化的操作,但是完全自上而下的重新渲染仍然效率低下。
对于不可变树,无状态组件只需检查它所依赖的子树是否与以前的值相比具有不同的身份,如果是这样的话 – 则可以完全避免渲染。