我一直在研究documentation以及如何将其与Next.js SSR一起使用,但我仍然不知道如何实际实现它,因为我能想到的每一种方法都没有任何意义。
根据this SO thread设置初始数据就像在选项中传递initialData
一样简单。然而,在当前版本中,它并不存在,并且已被SWRConfig
取代,而不是传递数据,您将所有内容 Package 在SWRConfig
中并传入fallbackData
(其本身的名称是愚蠢的,它被用作初始数据,它最初只是备用数据)。
但是,如果SWRConfig
是一个服务器组件,那么就没问题了,我可以让我的layout.tsx
import {SWRConfig} from "swr";
import {fetch_data} from "@/api/data";
export default async function Layout({
children,
}:{
children: React.ReactNode,
}) {
const fallbackData = await fetch_data();
return (
<SWRConfig value={{fallbackData}}>
{children}
</SWRConfig>
)
}
那么在{children}
内部可能有一个节点
import useSWR from "swr";
const get_data = async () => {...}
export default function Page() {
const {data, mutate} useSWR('/api/data', get_data);
//Use `data` that is initially set from SWRConfig
}
但是,SWRConfig
是客户端组件,这意味着它需要从服务器组件接收数据,然后将其设置为fallbackData
。导致public_layout.tsx
组件,但仅客户端从布局接收数据以设置为SWRConfig
'use client';
import { SWRConfig } from "swr";
import { type DataType } from "@/util/db";
export default function Layout({
children,
fallbackData,
}: {
children: React.ReactNode,
fallbackData: DataType[],
}) {
return (
<SWRConfig value={{fallbackData}}>
{children}
</SWRConfig>
)
}
然后,layout.tsx
仅使用PublicLayout
组件并传递数据
import {fetch_data} from "@/api/data";
import PublicLayout from './public_layout'
export default async function Layout({
children,
}: {
children: React.ReactNode
}) {
return (
<PublicLayout fallbackData={await fetch_data()}>
{children}
</PublicLayout>
)
}
最后可以使用它,代码与上面的Page()
相同。
这不可能是正确的做事方式吧?
*如果是正确的方式,有没有更干净、更少混乱的设置方式?
*如果是错误的方式,我应该做什么?
- 我怎么读“SWR”?我一直念“下水道”*
1条答案
按热度按时间umuewwlo1#
我最终没有使用SWR,因为将它与RxJS连接是一件痛苦的事情,所以我只是手动完成了它,我仍然得到了我想要的乐观的UI。
它以一种更好的方式布局,通过它,我可以添加RxJS支持和去跳请求,并批量进行更改