项目使用redux工具包和rtk查询。数据是从一个 api 获取的,但代码被分成更小的块以反映逻辑部分,例如
...ETC
注销后,rtk 查询会保留其状态,因此下次登录时数据是旧的。它们甚至可能不反映当前用户。如何使所有缓存失效?
Dmi*_*tis 35
其实很简单,但是我不得不重构代码。
我为每个逻辑部分创建了新的 api。因此,要使缓存无效,我必须单独重置每个 api 的状态。
幸运的是,rtk它具有代码分割功能:
https ://redux-toolkit.js.org/rtk-query/usage/code-splitting
基本上你的创建baseApi是这样的:
export const baseApi = createApi({
baseQuery: fetchBaseQuery({
baseUrl: `${BASE_URL}/api`,
prepareHeaders: (headers, { getState }) => {
const token = (getState() as RootState).auth.token;
if (token) {
headers.set("authorization", `Bearer ${token}`);
}
return headers;
},
}),
tagTypes: ["Vehicle", "CompanySetting", "Associate"],
endpoints: () => ({}),
});
Run Code Online (Sandbox Code Playgroud)
然后你可以在单独的文件中添加 api 切片,如下所示:
export const companySettingsApi = baseApi.injectEndpoints({
endpoints: (builder) => ({
getCompanySettings: builder.query<CompanySetting[], void>({
query: () => ({
url: `/companySettings`,
}),
providesTags: (_) => ["CompanySetting"],
}),
setCompanySettings: builder.mutation<void, CompanySetting[]>({
query: (companySettings) => ({
url: `/companySettings`,
method: "PUT",
body: companySettings,
}),
invalidatesTags: (_) => ["CompanySetting"],
}),
}),
});
Run Code Online (Sandbox Code Playgroud)
这使您能够通过一次调度重置整个 api 状态
dispatch(baseApi.util.resetApiState());
Run Code Online (Sandbox Code Playgroud)
小智 21
解决方案:这将立即删除所有现有的缓存条目,并且所有查询将被视为“未初始化”。因此,只需将以下代码放入onClick或根据您的场景,这样当您点击输入请求时,缓存就会被清除。下面的api是您将在存储中的 rtk 查询中设置的 api 名称。
dispatch(api.util.resetApiState());
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请查看文档https://redux-toolkit.js.org/rtk-query/api/created-api/api-slice-utils
小智 15
例如,如果您只需要重置特定缓存,CompanySettings您还可以使用:
dispatch(api.util.invalidateTags(['CompanySettings'])
Run Code Online (Sandbox Code Playgroud)
文档https://redux-toolkit.js.org/rtk-query/api/created-api/api-slice-utils#invalidatetags
| 归档时间: |
|
| 查看次数: |
39983 次 |
| 最近记录: |