【发布时间】:2022-12-15 02:55:37
【问题描述】:
最近新的react-router 6.4 发布了,它有能力在组件渲染之前加载数据。 (https://reactrouter.com/en/main/start/overview#data-loading)
这似乎是一个很酷的功能。我想将它与 RTK 查询一起使用,因为我已经在使用 Redux Toolkit。
所以我想要一个基本的东西,我有 api 来加载帖子。我想加载它们,如果请求失败 - 重定向到其他页面。在react-router 6.4 中,这一切都可以在路由器中完成(https://reactrouter.com/en/main/start/overview#redirects)。
路由器在反应范围之外,所以我不能使用 rtk 查询提供的钩子,所以这意味着我必须使用没有钩子的 rtk 查询,根据文档这是完全可能的(https://redux-toolkit.js.org/rtk-query/usage/usage-without-react-hooks)
所以我的问题是,如何读取 react-router 加载程序中的请求状态。我能够使用挂钩读取组件中的状态,但它会使组件“变脏”并在整个应用程序中传播逻辑。
import React from "react";
import ReactDOM from "react-dom/client";
import { createBrowserRouter, RouterProvider } from "react-router-dom";
import { Provider } from "react-redux";
import { store } from "./redux/redux";
import { Comments } from "./Comments";
import { Posts } from "./Posts";
import { Root } from "./Root";
import { postsApi } from "./redux/redux";
const router = createBrowserRouter([
{
path: "/",
element: <Root />,
},
{
path: "posts",
element: <Posts />,
loader: () => {
store.dispatch(postsApi.endpoints.getPosts.initiate());
const request = postsApi.endpoints.getPosts.select()(store);
console.log(request);
return request;
},
},
{
path: "/comments",
element: <Comments />,
},
]);
const root = ReactDOM.createRoot(
document.getElementById("root") as HTMLElement
);
root.render(
<Provider store={store}>
<RouterProvider router={router} />
</Provider>
);
我正在尝试使用文档中的示例,但我总是在控制台中获得“未初始化”状态,就像从未发出过请求一样,但我可以在 redux 开发工具中看到数据。而且我还收到错误消息“在state.postsApi 找不到数据。您是否忘记将减速器添加到商店?”
【问题讨论】:
标签: reactjs react-router react-router-dom rtk-query