そのため、1週間前にReactの学習を開始しましたが、必然的に状態の問題と、コンポーネントがアプリの他の部分とどのように通信するかという問題に直面しました。探し回ったところ、Reduxが今月の味のようです。私はすべてのドキュメントを読みましたが、実際にはかなり革新的なアイデアだと思います。これが私の考えです:
州は一般的にかなり邪悪であり、プログラミングのバグの大きな原因であることに同意しています。アプリ全体に分散させるのではなく、Reduxは、変更するアクションを発行する必要があるグローバル状態ツリーにすべてを集中させないのはなぜですか?面白そう。すべてのプログラムには状態が必要なので、1つの不純なスペースに貼り付け、そこからのみ変更して、バグを簡単に追跡できるようにします。次に、個々の状態の断片をReactコンポーネントに宣言的にバインドし、それらを自動再描画させることもできます。すべてが美しいです。
ただし、このデザイン全体について2つの質問があります。まず、状態ツリーが不変である必要があるのはなぜですか?タイムトラベルのデバッグやホットリロードは気にせず、アプリに元に戻す/やり直しをすでに実装しているとします。これをしなければならないのはとても面倒に思えます:
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;
}
これは、発行されたアクションによって変更されたグローバル状態ツリーですが、非常にシンプルで効率的です。
immutablejs
て使用return state.setIn([action.index, 'completed'], true);
してください。