官网

Redux 配合使用,解决使用 Redux 时,配置繁琐和模板代码太多的问题。

使用心得

Usage With TypeScript

export const store = configureStore({
   ...
});

export type RootState = ReturnType<typeof store.getState>
export type AppDispatch = typeof store.dispatch
export const useAppDispatch = () => useDispatch<AppDispatch>()
export const useAppSelector: TypedUseSelectorHook<RootState> = useSelector

RTK Query

获取和缓存数据

Code Splitting

分割代码,规范代码结构,减少模板代码

数据持久化

1. Persistence and Rehydration
2. Redux Persist
const persistConfig = {
  key: "root",
  storage,
  whitelist: ["auth", "router"],
};

export const store = configureStore({
  reducer: persistReducer(
    persistConfig,
    combineReducers({
      auth: authReducer,
      router: routerReducer,
      district: districtReducer,
      [authApi.reducerPath]: authApi.reducer,
      [userApi.reducerPath]: userApi.reducer,
    })
  ),
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware({ serializableCheck: false }).concat(
      authApi.middleware,
      userApi.middleware
    ),
});

export const persist = persistStore(store);
3. Queries
import { createApi, fetchBaseQuery } from "@reduxjs/toolkit/query/react"; //使用 Hook 一定要导入这个包
4. Customizing queries

自己实现一个 baseQuery 就可以添加 header,解析自定义返回值和异常处理

const myFetchBaseQuery: BaseQueryFn<
  string | FetchArgs,
  unknown,
  FetchBaseQueryError,
  {},
  FetchBaseQueryMeta
> = async (args, api, extraOptions) => {
  const result = await fetchBaseQuery({
    baseUrl: apiUrl,
    prepareHeaders: (headers, { getState }) => {
      const token = (getState() as RootState).auth.token;
      if (token) {
        headers.set("authorization", `Bearer ${token}`);
      }
      return headers;
    },
  })(args, api, extraOptions);
  return new Promise<any>((resolve, reject) => {
    let response: Result<any>;
    const { error } = result;
    if (error) {
      response = error.data as Result<any>;
    } else {
      response = result.data as unknown as Result<any>;
    }
    const { data, code, msg } = response;
    if (code >= 200 && code < 300) {
      result.data = data;
      resolve(result);
    } else {
      showError(msg ?? "");
      reject(msg);
    }
  });
};