所以我在一周前开始学习React,我不可避免地遇到了状态问题,以及组件应该如何与应用程序的其余部分通信.我四处搜索,发现Redux似乎是这个月的特色.我通读了所有的文档,我认为这实际上是一个相当革命性的 idea .以下是我的 idea :
人们普遍认为,国家是相当邪恶的,是编程中的一大漏洞来源.Redux说,与其把它们分散在整个应用程序中,不如把它们全部集中在一个全局状态树中,这样你就必须发出改变的动作?听起来很有趣.所有的程序都需要状态,所以让我们把它放在一个不纯净的空间里,只从里面修改它,这样bug就很容易被追踪到.然后,我们还可以声明性地绑定各个状态块以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;
}
它仍然是一个全局状态树,通过发出的动作进行变异,但非常简单高效.