标签: rtk-query

msw 无法在单次测试中第二次将相同的请求与更新的数据相匹配

我有一个使用 RTK 查询挂钩生成的简单家庭列表,其中可以将项目标记为最喜欢的,并根据标签失效自动重新获取数据。虽然当我在测试中运行项目时一切正常,但 msw 无法匹配在突变成功通过标签失效触发后第二次调用的相同 GET 请求。

服务:

export const homesApi = createApi({
reducerPath: 'homesApi',
baseQuery: fetchBaseQuery({
  baseUrl: API_URL,
  prepareHeaders: (headers, { getState }) => {
    headers.set('Accept', `application/json`);
    return headers;
  },
}),
tagTypes: [
  'Homes',
],
endpoints: (builder) => ({
  getHomes: builder.query({
    query: (params) => {
      
      const url = qs.stringifyUrl(
        { url: '/homes', query: params },
        { skipEmptyString: true, skipNull: true }
      );

      return url

    },
    providesTags: (result) =>
      result?.data
        ? [
            ...result.data.map(({ id }) => ({ type: 'Homes', id …
Run Code Online (Sandbox Code Playgroud)

reactjs jestjs react-testing-library msw rtk-query

5
推荐指数
1
解决办法
3352
查看次数

为什么使用 RTK 查询标准化状态的需要较少?

根据redux 文档:“虽然使用 RTK 查询管理缓存数据来将响应存储在规范化查找表中的需要较少,但如果需要,可以利用 TransformResponse 来做到这一点。”

  1. 为什么 RTK 查询“不需要”管理缓存数据?
  2. 使用 RTK 查询标准化状态有哪些权衡?

redux rtk-query

5
推荐指数
1
解决办法
2535
查看次数

如何使用React测试库测试RTK查询?

我正在尝试使用 RTK 查询,但找不到如何使用 React 测试库为使用 RTK 查询请求的组件编写单元测试的好示例。

例如,我们有一个从服务器获取某些内容的列表的组件。如何模拟请求数据?我找到了一个用于mswjs模拟 API 测试的解决方案。

await new Promise((r) => setTimeout(r, 1000));但即使有了它,我仍然遇到一个问题:在检查集合中的某些内容是否存在之前,我需要添加。
也许,有人知道如何使用 RTK 查询测试组件?

javascript reactjs redux rtk-query

5
推荐指数
1
解决办法
2万
查看次数

RTK 查询仅在用户停止在搜索字段中输入后运行查询

我对使用 useEffect、useCallback 和运行 RTK 查询有点困惑。我想要实现的目标是用户能够根据应用程序中提供的输入字段搜索电影。

有一个带有输入字段的主页,供用户搜索电影。另外,我在 RTK 查询 API 中有一个 useSearchMovieQuery ,它可以搜索用户在搜索字段中输入的任何内容。我想阻止查询在初始渲染上运行,这可以通过使用“skip”或“skipToken”跳过查询来实现。

我只想在用户停止输入后运行此查询,而不是在搜索字段中的 onChange 事件之后立即运行。

这是我到目前为止所尝试过的。

const Home = () => {
  const [page, setPage] = useState<number>(1);
  const [skip, setSkip] = useState<boolean>(true);
  const [searchQuery, setSearchQuery] = useState<string>("");
  const { data: popularMovies, isLoading: popularLoading } =
    useGetPopularMoviesQuery(page);
  const { data: topRatedMovies, isLoading: topRatedLoading } =
    useGetTopRatedMoviesQuery();
  const { data: upcomingMovies, isLoading: upcomingLoading } =
    useGetUpcomingMoviesQuery();
  const {
    data: searchResult,
    isSuccess: searchedForMovie,
    isFetching,
    isError,
  } = useSearchMovieQuery(searchQuery, { skip });
  const handleOnChangePage …
Run Code Online (Sandbox Code Playgroud)

typescript reactjs redux-toolkit rtk-query

5
推荐指数
1
解决办法
2330
查看次数

如何使用redux工具包查询(RTKQ)访问transformResponse中的查询参数?

我正在使用 RTK 查询进行 POST 调用。我能够将有效负载数据传递给我的查询,但我想访问我的transformResponse函数内的查询参数“id”。但发现没有办法这样做。

下面是我的代码

export const apiSlice = createApi({
  reducerPath: 'api',
  
  baseQuery: fetchBaseQuery({ baseUrl: '/fakeApi' }),
 
  endpoints: builder => ({
    
    getPosts: builder.query({
      
      query: ({id}) => ({ url, method: 'POST', body: { id } }),
      transformResponse: (response) => { console.log(response, id) } //How can I access the 'id' from query here?
    })
  })
})
Run Code Online (Sandbox Code Playgroud)

如何访问函数内的查询负载transformResopnse

我还尝试将传递arg给transformResponse函数,但arg对我来说是未定义的。

(response, meta, arg)
Run Code Online (Sandbox Code Playgroud)

arg 对我来说是未定义的。

javascript reactjs redux redux-toolkit rtk-query

5
推荐指数
1
解决办法
2636
查看次数

RTK 查询 fetchBaseQuery util 缺少什么插件 axios?

在RTK查询的文档中,这是向util提供的介绍fetchBaseQuery

这是一个非常小的包装器fetch,旨在简化请求。axios它不是、superagent或任何其他重量级库的全面替代品,但它可以满足您的大部分需求。

好的,我知道 fetchBaseQuery 并不完美,但是什么时候应该使用 fetchBaseQuery 而不是axiosor superagent

有哪些权衡?

typescript reactjs redux-toolkit rtk-query

5
推荐指数
1
解决办法
8264
查看次数

第一次完成后如何调用 RTK 突变

我正在使用REDUX-TOOLKIT-QUERY,现在我有一种情况,我必须调用一个突变。一旦该突变返回响应,我就必须在其他三个突变中使用该响应作为请求参数。我们如何以正确的方式实施这一点?

const [getSettings, { isLoading, data: Settings }] =useSettingsMutation();
  const [getMenu] =useMenuMutation();
  const [getServices] = useServicesMutation();
  useEffect(() => {
    const obj = {
      Name: "someNme",
    };
    if (obj) getSettings(obj);
    if (Settings?._id ) {
      const id = settings._id;
       getServices(id);
     getMenu(id);
     getServices(id);
    }
  }, []);
Run Code Online (Sandbox Code Playgroud)

redux react-redux redux-toolkit rtk-query

5
推荐指数
1
解决办法
1140
查看次数

使用 MSW 和 Jest 时,如何在请求之间的测试中清除 RTK 查询缓存?

我正在使用 Redux Toolkit 和 RTK Query 与 MSW 进行模拟,但在尝试在测试中返回错误时,我似乎得到了相同的数据。我怀疑这是 RTK 查询缓存行为的问题,并尝试使用工具包 createApi 方法的这些选项来禁用它,但它们似乎没有解决该问题:

keepUnusedDataFor: 0,
refetchOnMountOrArgChange: true,
refetchOnFocus: true,
refetchOnReconnect: true,
Run Code Online (Sandbox Code Playgroud)

在 MSW 文档中,它给出了如何在使用其他库时解决此问题的示例:https://mswjs.io/docs/faq#why-do-i-get-stale-responses-when-using-react-queryswretc

// react-query example
import { QueryCache } from 'react-query'

const queryCache = new QueryCache()

afterEach(() => {
  queryCache.clear()
})

// swr example
import { cache } from 'swr'

beforeEach(() => {
  cache.clear()
})
Run Code Online (Sandbox Code Playgroud)

使用 Redux Toolkit 和 RTK Query 时如何实现相同的效果?

jestjs redux redux-toolkit msw rtk-query

4
推荐指数
1
解决办法
6220
查看次数

使用 React Hooks 通过 RTK 查询进行链式查询/变异调用

在下面的示例中,我尝试使用 React 和 Redux Toolkit 创建一个简单的登录/身份验证组件。

const Login = () => {
    const dispatch = useDispatch();
    const [login, { isLoading }] = useLoginMutation();
    const [loginData, setLoginData] = useState({
        email: '',
        password: '',
    });

    const loginHandler = async () => {
        try {
            const result = await login({
                email: loginData.email,
                password: loginData.password,
            }).unwrap();

            const { token, userId } = result;

            const { data } = await dispatch(
                backendApi.endpoints.getUser.initiate({ token, userId })
            );

            dispatch(
                setCredentials({
                    user: {
                        email: data.user.email,
                        id: data.user.id,
                        name: …
Run Code Online (Sandbox Code Playgroud)

javascript reactjs redux react-redux rtk-query

4
推荐指数
1
解决办法
8561
查看次数

请求后更新其他切片

使用RTK Query,如何使用获取功能来更新另一个切片的状态?

本质上,我试图将所有相关状态保持在一起,因此在使用 查询数据后useLazyGetQuery,我想使用结果并将其存储在现有的切片状态中。

虽然像下面这样的东西可以在组件中工作,但它使整个代码变得混乱

  const [trigger, result, lastArg] = useLazyGetFiltersQuery();

  React.useEffect(() => {
    if (result.status === 'fulfilled' && result.isSuccess === true && result.isLoading === false) {
      dispatch(updateData(result.data.map((pg) => ({ label: pg, value: pg }))));
    }
  }, [dispatch, result, result.isLoading, result.isSuccess, result.status]);
Run Code Online (Sandbox Code Playgroud)

我宁愿直接在createApi方法中设置一些逻辑,以便将结果数据从头存储在我想要的切片中。

谢谢

redux-toolkit rtk-query

4
推荐指数
1
解决办法
4164
查看次数