反応器を整理するスキル(17-2)
Chapter 17:Ridexを使用してレスポンスアプリケーションの状態を管理する(2)
🎯 使いやすいアクション作成関数redux-actionライブラリとimmerライブラリを使用してリプレイを記述
1. redux-actions 動作生成関数をより短く記述することができる. スイッチ/ケース以外の文のhandleActions関数は で使用できます.
2.Counterモジュールで作成
import { createAction, handleActions } from 'redux-actions';に設定第1パラメータ更新関数として、初期状態を第2パラメータ に設定.
3.Todoモジュールで作成
modules/todos.js パラメータがある場合は、ペイロード名 を使用します. createActionの2番目の関数で負荷を定義する関数 を個別に宣言する
createActionで作成したアクション作成関数を使用して、パラメータ入力の値をactionとします.有効荷重の名目で共に入れる.
したがって,既存の更新ロジックにおいても行動する.ペイロード値の問合せと更新 action.負荷をよく理解できない場合は、非構造化分配構文によって、その値がどのような値を意味するかを正確に理解することができる. 4. immer yarn add immer 拡張演算子の奥行きを防ぐ カウンタのように簡単であれば、immerを使用するとより複雑になります.Todosモジュールに適用します. Todos.js 🎯 Hooksを使用したコンテナ構成部品の作成 connect関数 ではなくreact-reduxで提供されるhooksを使用します.
1.UserSelectorを使用してステータスを表示する connect関数の代わりにHook
const結果=ユーザーセレクタ(ステータス選択関数); MapStateToPropsのような役割です.ステータスのみクエリーできます. 2.useDispatchを使用した送信動作
コンポーネント内でショップの組み込み関数を使用して割り当てることができます. const dispatch = useDispatch(); dispatch({type: 'SAMPLE_ACTION'})
useCallback()を使用して再使用を防止 3.TodosContainerもHooksで設定一時無効
const store = useStore();
store dispatch({type:'SAMPLE_ACTION'})
store.getState();
5.UseActionsユーティリティの作成と使用で を参照
6.connect関数との違い connect:支柱を交換しないと、再レンダリングが自動的に回避され、パフォーマンスが最適化されます. ユーザー・セレクタ:冗長状態を問合せた場合、最適化操作は自動的に実行されません. React.memoをコンテナアセンブリに使用します. TodosContainer.js
export default React.memo(TodosContainer);
🎯 使いやすい
1. redux-actions
2.Counterモジュールで作成
import { createAction, handleActions } from 'redux-actions';
// createAction을 이용해 액션 생성 함수 설정
export const increase = createAction(INCREASE);
export const decrease = createAction(DECREASE);
// handleActions를 이용한 리듀서 함수 설정
const counter = handleActions(
{
[INCREASE]: (state, action) => ({ number: state.number + 1 }),
[DECREASE]: (state, action) => ({ number: state.number - 1 }),
},
initialState,
);
初期状態を3.Todoモジュールで作成
modules/todos.js
// createAction 사용해 액션 생성 함수 설정하기
export const changeInput = createAction(CHANGE_INPUT, (input) => input);
let id = 3;
export const insert = createAction(INSERT, (text) => ({
id: id++,
text,
done: false,
}));
export const toggle = createAction(TOGGLE, (id) => id);
export const remove = createAction(REMOVE, (id) => id);
// handleActions 를 이용한 리듀서 작성
const todos = handleActions(
{
[CHANGE_INPUT]: (state, action) => ({
...state,
input: action.payload,
}),
[INSERT]: (state, action) => ({
...state,
todos: state.todos.concat(action.payload),
}),
[TOGGLE]: (state, action) => ({
...state,
todos: state.todos.map((todo) =>
todo.id === action.payload ? { ...todo, done: !todo.done } : todo,
),
}),
[REMOVE]: (state, action) => ({
...state,
todos: state.todos.filter((todo) => todo.id !== action.payload),
}),
},
initialState,
);
createActionで作成したアクション作成関数を使用して、パラメータ入力の値をactionとします.有効荷重の名目で共に入れる.
したがって,既存の更新ロジックにおいても行動する.ペイロード値の問合せと更新
const todos = handleActions(
{
[CHANGE_INPUT]: (state, { payload: input }) => ({
...state,
input,
}),
[INSERT]: (state, { payload: todo }) => ({
...state,
todos: state.todos.concat(todo),
}),
[TOGGLE]: (state, { payload: id }) => ({
...state,
todos: state.todos.map((todo) =>
todo.id === id ? { ...todo, done: !todo.done } : todo,
),
}),
[REMOVE]: (state, { payload: id }) => ({
...state,
todos: state.todos.filter((todo) => todo.id !== id),
}),
},
initialState,
);
// immer 사용한 reducer
const todos = handleActions(
{
[CHANGE_INPUT]: (state, { payload: input }) =>
produce(state, (draft) => {
draft.input = input;
}),
[INSERT]: (state, { payload: todo }) =>
produce(state, (draft) => {
draft.todos.push(todo);
}),
[TOGGLE]: (state, { payload: id }) =>
produce(state, (draft) => {
const todo = draft.todos.find((todo) => todo.id === id);
todo.done = !todo.done;
}),
[REMOVE]: (state, { payload: id }) =>
produce(state, (draft) => {
const index = draft.todos.findIndex((todo) => todo.id === id);
draft.todos.splice(index, 1);
}),
},
initialState,
);
1.UserSelectorを使用してステータスを表示する
const結果=ユーザーセレクタ(ステータス選択関数);
const CounterContainer = () => {
const number = useSelector((state) => state.counter.number);
return <Counter number={number} />;
};
コンポーネント内でショップの組み込み関数を使用して割り当てることができます.
const dispatch = useDispatch();
return (
<Counter
number={number}
onIncrease={() => dispatch(increase())}
onDecrease={() => dispatch(decrease())}
/>
);
useCallback()を使用して再使用を防止
const dispatch = useDispatch();
const onIncrease = useCallback(() => dispatch(increase()), [dispatch]);
const onDecrease = useCallback(() => dispatch(decrease()), [dispatch]);
return (
<Counter number={number} onIncrease={onIncrease} onDecrease={onDecrease} />
);
```
const TodoContainer = () => {
const { input, todos } = useSelector(({ todos }) => ({
input: todos.input,
todos: todos.todos,
}));
const dispatch = useDispatch();
const onChangeInput = useCallback((input) => dispatch(changeInput(input)), [
dispatch,
]);
const onInsert = useCallback((text) => dispatch(insert(text)), [dispatch]);
const onToggle = useCallback((id) => dispatch(toggle(id)), [dispatch]);
const onRemove = useCallback((id) => dispatch(remove(id)), [dispatch]);
return (
<Todos
input={input}
todos={todos}
onChangeInput={onChangeInput}
onInsert={onInsert}
onToggle={onToggle}
onRemove={onRemove}
/>
);
};
export default TodoContainer;
```
4.usStoreを使用してリカバリストアを使用const store = useStore();
store dispatch({type:'SAMPLE_ACTION'})
store.getState();
6.connect関数との違い
export default React.memo(TodosContainer);
Reference
この問題について(反応器を整理するスキル(17-2)), 我々は、より多くの情報をここで見つけました https://velog.io/@tunakim/리액트를-다루는-기술-정리-17-2テキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol