我一直在观察人们使用useLoaderData()来提取传递给Reaction组件的值

以下是我在App.js中的代码,

const router = createBrowserRouter(
  createRoutesFromElements(
    <Route path='/' element={<RootLayout/>}>
      
      <Route path='user' loader={userLoader} element={<User/>}></Route>
      
    </Route>
  )
)

在元素中,

import { useLoaderData, Link } from "react-router-dom";

const User = () => {

    const users = useLoaderData();

    return (
        <div >
        </div>
    );


}

//loader function
export const userLoader = async () => {

    const res = await fetch('http://localhost:8000/user');
    return res.json();
}

export default User;

我的问题是,是否可以从多个URL提取并返回浏览器一次,然后使用useLoaderData()提取?

哪个东西看起来像这样

export const userLoader = async () => {
    const res1 = await fetch('http://localhost:8000/user');
    const user= res1.json();
    const res2 = await fetch('http://localhost:8000/car');
    const car= res2.json();

    return {user, car};    
}

我试过上面的代码,它返回了一个奇怪的promise

我注意到,每当我在装载器函数中用{}包围json结果时,它都会返回Promise,为什么会这样?


//loader function
export const userLoader = async () => {

    const res = await fetch('http://localhost:8000/user');
    return {res.json()}; ////why u cant put {}?
}

export default User;

推荐答案

花括号仅定义作用域或对象文字,声明为async的函数使其返回Promise对象.useLoaderData挂钩和RRD数据路由进行等待.当您使用以下内容时

export const userLoader = async () => {
  const res1 = await fetch('http://localhost:8000/user');
  const user = res1.json();
  const res2 = await fetch('http://localhost:8000/car');
  const car = res2.json();

  return { user, car };    
}

代码使用具有属性usercar的对象来解析隐式返回,这些对象本身就是未解析的Promise对象,例如res.json()返回Promise.

加载器也应该达到JSONpromise 的await.

export const userLoader = async () => {
  const res1 = await fetch('http://localhost:8000/user');
  const user = await res1.json();
  const res2 = await fetch('http://localhost:8000/car');
  const car = await res2.json();

  return { user, car };    
}

如果这些获取请求都不依赖于任何其他先前的请求解析,那么您可以通过使用Promise.all并发获取一些东西来提高速度.

示例:

export const userLoader = async () => {
  const [user, car] = await Promise.all([
    fetch('http://localhost:8000/user').then(res => res.json()),
    fetch('http://localhost:8000/car').then(res => res.json()),
  ]);

  return { user, car };    
}

Reactjs相关问答推荐

为什么我无法访问窗口事件处理程序中的状态?

从另一个组件更改组件中const的状态

从`redux—thunk`导入thunk `在stackblitz中不起作用

在Reaction中单击时,按钮未按预期工作

有没有可能在next.js和ssr中使用tsps?

有没有比;KeyableShell;组成部分

设置自定义形状的纹理

组件安装后调用自定义钩子

画布:用鼠标绘制形状时重新绘制整个画布会导致卡顿

为什么在 React 的 useEffect 中使用 onAuthStateChanged ?

修改React数据表扩展组件

如何让 useEffect 在 React.JS 中只运行一次?

使用 nextjs App Router 在动态客户端进行服务器端渲染

改变输入的默认值时出现问题:number react-hook-form

当从数组中删除数据时,UseEffect 不会重新渲染,仅在添加数据时才会重新渲染

如何使图标适合 react-bootstrap 中的行元素

使用 React 中的功能组件更改另一个组件的状态

未捕获的错误:操作必须是使用 redux/toolkit 的普通对象

从输入中获取数字时,react 计数器不会增加

在 React 中使用使用状态挂钩合并两个数组