RTK 查询 selectFromResult 导致使用未定义的参数不必要地调用 API
RTK Query selectFromResult causing unnecessary call to the API with undefined argument
我有一个参数可以是对象或未定义的查询。当我在我的组件中使用函数 selectFromResult
时,调用端点时参数为 undefined.
我明白它应该只从现有数据中获取值而不是调用没有参数的端点。
export const getMessages = (
build: EndpointBuilder<BaseQueryFn, string, string>
): QueryDefinition<
IGetMessagesArgs | undefined,
BaseQueryFn,
string,
IGetMessagesResponse
> =>
build.query<IGetMessagesResponse, IGetMessagesArgs | undefined>({
providesTags: ['Message'],
query: (queryArg: IGetMessagesArgs | undefined) => {
const paginationParamObject = {
conversation: queryArg?.conversation,
page: queryArg?.page,
};
const paginationQuery = serializeFlatObject(paginationParamObject, '?');
const filterQuery = serializeFilters(queryArg?.filters);
return {
url: `/api/messages${paginationQuery}${filterQuery}`,
};
}
});
在父组件中我这样称呼它
const { data: messages } = useGetMessagesQuery(
{ conversation: conversation || '' },
{ skip: !conversation }
);
在细节部分
const { message } = useGetMessagesQuery(undefined, {
selectFromResult: ({ data }) => ({
message: data?.items.find((el) => el.id === messageId),
}),
});
这种情况下selectFromResult
是不是用错了?
selectFromResult
只允许您使用选择器函数更改 result
的形状。
但除此之外,useGetMessagesQuery
仍然像 useGetMessagesQuery
一样工作 - 没有变化。因此,如果您使用 undefined
参数调用 useGetMessagesQuery
,它将启动对 undefined
参数的请求。
您的印象似乎是,一旦您添加 selectFromResult
,它只会为您提供该端点的随机缓存条目的结果 - 事实并非如此。
我有一个参数可以是对象或未定义的查询。当我在我的组件中使用函数 selectFromResult
时,调用端点时参数为 undefined.
我明白它应该只从现有数据中获取值而不是调用没有参数的端点。
export const getMessages = (
build: EndpointBuilder<BaseQueryFn, string, string>
): QueryDefinition<
IGetMessagesArgs | undefined,
BaseQueryFn,
string,
IGetMessagesResponse
> =>
build.query<IGetMessagesResponse, IGetMessagesArgs | undefined>({
providesTags: ['Message'],
query: (queryArg: IGetMessagesArgs | undefined) => {
const paginationParamObject = {
conversation: queryArg?.conversation,
page: queryArg?.page,
};
const paginationQuery = serializeFlatObject(paginationParamObject, '?');
const filterQuery = serializeFilters(queryArg?.filters);
return {
url: `/api/messages${paginationQuery}${filterQuery}`,
};
}
});
在父组件中我这样称呼它
const { data: messages } = useGetMessagesQuery(
{ conversation: conversation || '' },
{ skip: !conversation }
);
在细节部分
const { message } = useGetMessagesQuery(undefined, {
selectFromResult: ({ data }) => ({
message: data?.items.find((el) => el.id === messageId),
}),
});
这种情况下selectFromResult
是不是用错了?
selectFromResult
只允许您使用选择器函数更改 result
的形状。
但除此之外,useGetMessagesQuery
仍然像 useGetMessagesQuery
一样工作 - 没有变化。因此,如果您使用 undefined
参数调用 useGetMessagesQuery
,它将启动对 undefined
参数的请求。
您的印象似乎是,一旦您添加 selectFromResult
,它只会为您提供该端点的随机缓存条目的结果 - 事实并非如此。