我正在实施一种新的Reaction路由.我正在使用新的createBrowserRouter,并希望实现一些loader个API调用.我已经将我的项目设置为正确地进行这些API调用,但是我找不到任何关于如何实际处理这些数据的文档.

我希望将响应数据向下传递给我的组件,但不清楚我是如何做到这一点的.

我有一个包含此网络请求的API文件夹.

export function getReasonTypes() {
  commonAxios
    .get('/api/ReasonTypes?activeOnly=true')
    .then(function (response) {
      console.log(response)
      return response.data
    })
    .catch(function (error) {
      console.log(error)
    })
}

我在创建路由时导入此函数:

function defaulNewAPIs() {
  const data = getReasonTypes()
  return { data }
}

const router = createBrowserRouter([
  {
    path: '/:appTypeId?',
    element: <AppLayout />,
    loader: defaulNewAPIs,
    children: [
      {
        index: true,
        element: <ReferralDetails status="new" />,
      },
    ],
  },
])

ReactDOM.createRoot(document.getElementById('root')!).render(
  <GenReMsal>
    <React.StrictMode>
      <AuthenticatedTemplate>
        <RouterProvider router={router} />
      </AuthenticatedTemplate>
      <UnauthenticatedTemplate>
        <GenReLogin />
      </UnauthenticatedTemplate>
    </React.StrictMode>
  </GenReMsal>
)

上面的代码成功调用了我的API,根据控制台日志(log)可以看到它正确地获取了数据.如何将此数据传递到我的路由元素?

推荐答案

getReasonTypes函数需要返回defaulNewAPIs路由加载器函数的值才能返回到路由组件.

  • 返回Promise链

    export function getReasonTypes() {
      return commonAxios // <-- return Promise to defaultNewAPIs
        .get('/api/ReasonTypes?activeOnly=true')
        .then(function (response) {
          console.log(response);
          return response.data; // <-- returned to getReasonTypes
        })
        .catch(function (error) {
          console.log(error);
          throw error;
        });
    }
    
  • 使用async/await

    export async function getReasonTypes() {
      try {
        const response = await commonAxios.get('/api/ReasonTypes?activeOnly=true')
        console.log(response);
        return response.data; // <-- return value to defaultNewAPIs
      } catch(error) {
        console.log(error);
        throw error;
      };
    }
    

defaulNewAPIs加载器函数应等待getReasonTypes函数返回的解析值.

async function defaultNewAPIs() {
  const data = await getReasonTypes();
  return { data };
}

要读取已加载路径状态的组件应使用useLoaderData

import { useLoaderData } from 'react-router-dom';

const AppLayout = () => {
  const data = useLoaderData();

  ...
};

或者useRouteLoaderData个钩子.

const router = createBrowserRouter([
  {
    path: '/:appTypeId?',
    id: "root",
    element: <AppLayout />,
    loader: defaultNewAPIs,
    children: [
      {
        index: true,
        element: <ReferralDetails status="new" />,
      },
    ],
  },
])
import { useRouteLoaderData } from "react-router-dom";

const ReferralDetails = ({ status }) => {
  const data = useRouteLoaderData("root");

  ...
}

Javascript相关问答推荐

使用redux-toolet DelivercThunks刷新访问令牌

如何在不分配整个数组的情况下修改包含数组的行为主体?

React:未调用useState变量在调试器的事件处理程序中不可用

JQuery. show()工作,但. hide()不工作

更改JSON中使用AJAX返回的图像的路径

将旋转的矩形zoom 到覆盖它所需的最小尺寸&S容器

屏幕右侧屏障上的产卵点""

cypress中e2e测试上的Click()事件在Switch Element Plus组件上使用时不起作用

无法使用单击按钮时的useState将数据从一个页面传递到另一个页面

如何在coCos2d-x中更正此错误

当使用';字母而不是与';var#39;一起使用时,访问窗口为什么返回未定义的?

JQuery Click事件不适用于动态创建的按钮

当我try 将值更改为True时,按钮不会锁定

用于部分字符串的JavaScript数组搜索

在渲染turbo流之后滚动到元素

Reaction即使在重新呈现后也会在方法内部保留局部值

我不知道如何纠正这一点.

如何在Jest中模拟函数

如何在Firebase中读取对象的特定字段?

如何在单击Search按钮时更新Reaction组件?