在next.js中构建一个无限滚动,我试图调用我的serverAction来加载MoreData,并使用javaC/await来等待API调用并获取结果。
获取错误:
“客户端组件尚不支持”/await“,仅服务器组件支持。
tsx是一个服务器组件,它为初始图像调用同一个服务器操作一次。
// page.tsx
const Home = async ({ searchParams }) => {
const searchKeyword =
typeof searchParams.keyword === "string" ? searchParams.keyword : "";
let apiResponse = await getPhotos({ query: searchKeyword });
return (
<main className='p-6 flex justify-center w-full min-h-screen bg-black'>
<InfiniteScrollData
search={searchKeyword}
initialData={apiResponse?.results || []}
/>
</main>
);
};
export default Home;
字符串
下面是服务器操作:
// actions.ts
"use server";
export const getData = async ({
query,
}) => {
const { response } = await fetchData({
query,
});
apiResponse = response;
return response;
};
型
下面是客户端组件
// InfiniteScrollData.tsx
"use client";
// imports
const InfiniteScrollImages: = ({
search,
initialData,
}) => {
const [data, setData] = useState(initialData);
const [page, setPage] = useState(1);
const [loaderRef, inView] = useInView();
const loadMoreData = useCallback(async () => {
const next = page + 1;
const response = await getData({ query: search, page: next });
if (response?.results?.length) {
setPage(next);
setData((prev) => [...prev, ...(response?.results || [])]);
}
}, [page, search]);
useEffect(() => {
if (inView) {
loadMoreData();
}
}, [inView, loadMoreData]);
return (
<>
<div>
{photos?.map((item) => (
<Card key={item.id} data={item} />
))}
</div>
<div ref={loaderRef}>
<Loader />
</div>
</>
);
};
export default InfiniteScrollImages;
型
使用email protected(https://stackoverflow.com/cdn-cgi/l/email-protection)
也许有另一种从客户端组件调用服务器操作的方法?
1条答案
按热度按时间eqqqjvef1#
你的错误直接表明你不能在客户端组件中执行
await
函数,所以你应该在代码中摆脱它:字符串