immerを使いましょう!
reactのステータス管理を理解してください!
reactは簡単な比較で状態管理を行うことが知られている.すなわち、比較的浅いためにpushなどを直接変更すると、反応に変化が検出されないため、再レンダリングは行われない.
なぜイメルを使うのですか?
ただし、展開演算子を使用すると値を変更するたびにかなり不便です.しかも深ければ深いほど不便です.
immerを例にとると、正式なドキュメントを表示すると
Immer simplifies handling immutable data structures
があります.そこでimmerを使いました.まずimmerの使い方を知りましょう.
正式なドキュメントでは、
に表示されます.
Productにより不変オブジェクトを管理し、最初のパラメータはステータス値を入力します.2番目のパラメータはdraftをパラメータとし、アイテムの状態を変更する関数を渡します.
import produce from "immer"
const nextState = produce(baseState, draft => {
draft[1].done = true
draft.push({title: "Tweet about it"})
})
const baseState = [
/* as is */
]
const nextState = toggleTodo(baseState, "Immer")
そうです.すなわちdraftで現在値を変更すればよい.ただし、すべてのreduceではproductで値を変更するのは不便な方法かもしれません.そこで、カスタム減速機を作ってあげました.
createReducer関数の作成
export function createReducer(initialState, handlerMap) {
return function (state = initialState, action) {
const handler = handlerMap[action.type];
if (handler) {
return produce(state, (draft) => {
handler(draft, action);
});
} else {
return state;
}
};
}
createReducerは、2つのパラメータの初期設定を受け入れます.次に動きがあれば、動きに合ったハンドルを見つけて生産します.
たとえば、SetUserという名前のアクションタイプが呼び出された場合.
(state, action) => {
state.name = action.name;
state.isLogin = action.name ? "Login" : "NotLogin";
},
これらのプロセッサはマッピングされます.次にhandlerが存在する場合はproductを返します.
初期INITは動作に入るのでhandlerはありませんので、handlerがなければ例外処理をしなければなりません.
また、航続機では動作が発生し、状態が変化しなければ元の状態に戻らなければならない.
(このエラーの検索に時間がかかりました…)
このようにcreateReducerを作成すれば、Reducerでは特に不変性に注意する必要はありません.
createReducerの使用
const reducer = createReducer(INITIAL_STATE, {
[Types.SetUser]: (state, action) => {
state.name = action.name;
state.isLogin = action.name ? "Login" : "NotLogin";
},
});
このように快適に使えばいいのです!コメントドキュメント📖
immer docs
Reference
この問題について(immerを使いましょう!), 我々は、より多くの情報をここで見つけました https://velog.io/@jinn2u/immer를-사용해보자テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol