-
Notifications
You must be signed in to change notification settings - Fork 0
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Redux #181
Comments
アクション:ストアのデータを書き換える何かしらのイベント アクションのログを取るだけで全ての変化を記録できる。
TypeScriptの場合は型も一緒にインストール
|
Redux Toolkithttps://redux-toolkit.js.org/
|
アクション(Action)const action = {
type: 'increment',
}; アクションはプレーンなオブジェクト。 リデューサー(Reducer)const reducer = (state, action) => {
...
return newState;
} リデューサーはステートとアクションを受け取り、新しいステートを返す関数。 リデューサーの中で非同期通信をしたりランダム値を計算してはならない。 ストア(Store)const store = createStore(reducer); ストアはリデューサーを1つ持つ。 store.dispatch(action); ストアは ミドルウェアストアを拡張する。
|
Redux Toolkitストア(Store)configureStoreconst store = configureStore({
reducer: {
counter: counterReducer,
},
}); Redux Toolkit では reducer に指定したオブジェクトのキー名はそのままステートのキー名となる。 スライス(Slice)機能ごとに分割したリデューサーとアクションのセット。 createSliceconst counterSlice = createSlice({
name: 'counter',
initialState,
reducers: {
increment: (state) => {
state.value += 1;
},
decrement: (state) => {
state.value -= 1;
},
},
});
counterSlice.reducer; // リデューサー
counterSlice.actions.increment(); // typeが "counter/increment" のアクションを生成する アクションのtypeは createSliceに渡した
// 通常のリデューサー
const newState = {
...state,
value: state.value + 1,
};
// createSlice内のリデューサー
state.value += 1; 内部でImmerというライブラリを使っているとのこと。 prepare関数リデューサーと一緒にアクションのpayloadを設定する関数を設定できる。 const counterSlice = createSlice({
name: 'counter',
initialState,
reducers: {
incrementAmount: {
reducer(state, action) {
state.value += action.payload.amount;
},
prepare(amount) {
return { payload: { amount } };
}
}
},
}); サンク(Thunk)内部で非同期処理を行い、処理が終わったタイミングでdispatchを行う関数のことをサンクと呼ぶ。 // サンククリエーター関数
const incrementAsync = amount => {
// サンク関数
return (dispatch, getState) => {
setTimeout(() => {
dispatch(incrementByAmount(amount));
}, 1000);
}
};
store.dispatch(incrementAsync(5)); サンクを使用するには 内部でajax通信を行うサンク関数の例。 // サンククリエーター関数
const fetchUserById = userId => {
// サンク関数
return async (dispatch, getState) => {
try {
const user = await userAPI.fetchById(userId)
dispatch(userLoaded(user))
} catch (err) {
// エラー処理
}
}
} createAsyncThunkstart/success/failure アクションを自動的にディスパッチするサンクを作成する。 const fetchPosts = createAsyncThunk('posts/fetchPosts', async() => {
const response = await client.get('/fakeApi/posts');
return response.posts;
}); 第一引数はアクションタイプのプレフィックス。 セレクターuseSelectorRedux自体の機能。 const count = useSelector(state => {
return state.counter.value,
}); ストアが更新されると ディスパッチuseDispatchRedux自体の機能。 const dispatch = useDispatch();
dispatch({
type: "counter/increment",
}); createSelectoruserSelector のメモ化版。 createEntityAdapter要素のコレクション(ユーザーリストや投稿リストなど)を扱いやすくするためのAPI。
const adapter = createEntityAdapter({
sortComparer: (a, b) => b.date.localeCompare(a.date)
});
console.log(adapter.getInitialState()); // { ids: [], entities: {} } ステートにプロパティを追加したい場合は console.log(adapter.getInitialState({
otherState: 'other',
})); // { ids: [], entities: {}, otherState: 'other' } コレクションに要素を追加する場合は 同じように、更新と追加を行いたい場合は
export const {
selectAll,
selectById,
selectIds,
} = postAdapter.getSelectors(state => state.posts); |
The text was updated successfully, but these errors were encountered: