javascript - React-router 6.0 - useLoaderData 返回一个 promise 。无法显示数据

标签 javascript reactjs react-router react-router-dom

https://github.com/erAnusriM/react_router_trial 上面是我的github仓库。 如何实现在 App.jsx 文件中打印从 API 返回的用户列表 当我在控制台上打印结果的值时,它会给我一个 Response 对象。

预期行为 结果应该是一个数组对象

实际行为 结果是一个 Response 对象

引用https://reactrouter.com/en/main/hooks/use-loader-data
以下是我的源代码

main.jsx

import React, { useRef } from "react";
import ReactDOM from "react-dom/client";
import { createBrowserRouter, defer, RouterProvider } from "react-router-dom";
import Homepage from "./App";
import "./index.css";

const router = createBrowserRouter([
  {
    path: "/",
    element: <Homepage />,

    loader: async ({ request, params }) => {
        
      const data = fetch('https://jsonplaceholder.typicode.com/users');

      return defer({
        results: data,
      });
    },
  },
]);

ReactDOM.createRoot(document.getElementById("root")).render(
  <React.StrictMode>
    <RouterProvider router={router} />
  </React.StrictMode>
);

App.jsx

import React, { useState } from 'react'
import { useLoaderData, Await, useAsyncValue } from "react-router-dom";
import reactLogo from './assets/react.svg'
import './App.css'

const Homepage = () => {
  const {results} = useLoaderData()

 // Render the data when it is available
  return <React.Suspense
  fallback={<p>Loading data...</p>}
>

  <Await
    resolve={results}
    errorElement={
      <p>Error loading data</p>
    }
      
  >
    
     {(results) => {
       console.log("results", results); <== **prints results as a Response object not array**
       return <>Hello</>;
     }}
  
    
  </Await>
</React.Suspense>
};

export default Homepage;

最佳答案

在您的loader函数中,datafetch响应值,而不是实际数据。 “https://jsonplaceholder.typicode.com/users” 返回必须访问的 JSON 值。这是另一个值得等待的 Promise。

典型的加载程序流程可能类似于:

loader: async ({ request, params }) => {
  const response = await fetch("https://jsonplaceholder.typicode.com/users");

  return { results: response.json() };
}
const { results } = useLoaderData();

当此加载程序可能比平时花费更多时间时,可以使用defer实用程序。

loader: async ({ request, params }) => {
  const response = await fetch("https://jsonplaceholder.typicode.com/users");

  return defer({
    results: response.json()
  });
}
const Homepage = () => {
  const { results } = useLoaderData();

  // Render the data when it is available
  return (
    <React.Suspense fallback={<p>Loading data...</p>}>
      <Await resolve={results} errorElement={<p>Error loading data</p>}>
        {(results) => {
          console.log({ results }); // <-- array of objects
          return <>Hello</>;
        }}
      </Await>
    </React.Suspense>
  );
};

关于javascript - React-router 6.0 - useLoaderData 返回一个 promise 。无法显示数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75604745/

相关文章:

javascript - onmouseover 不起作用

javascript - 切换到 Lighttpd 后,Ajax 在 Chrome 中停止工作

JavaScript 表单代码不起作用?

javascript - 当父组件的状态发生变化时,如何在 React 中更新(重新渲染)子组件?

react-router - 获取 404 以获取将 create-react-app 部署到 github 页面的链接

javascript - JS如何给数组的特定位置添加一个值

javascript - 带有反应和验证器的 Redux 形式

reactjs - 在 React 中上传多张图片

javascript - React-Router 1.0.0RC1 - 将状态作为属性传递给子路由

reactjs - 如何在react组件中访问url参数