我希望你有一个伟大的日子!我有个问题...我目前正在学习next.js 13,所以我想用它做一个个人项目是个好主意。目前,我正在做一个电子商务与Sanity.io作为一个CMS。我得到的问题是,即时通讯获取数据与异步函数,但我也想使用“使用状态”钩从React做一个不错的产品图片查看器!我得到的问题是,我不能使用一个异步函数内部的钩子!所以请如果有人得到一个解决方案,我会非常高兴,因为我真的是新的next.js 13这里是我的代码和我想做的
"use client"
import { Product } from '@/component';
import { getProduct, getProducts } from '@/sanity/sanity-utils';
import React, { useState } from 'react';
import { AiOutlineMinus,AiOutlinePlus,AiFillStar,AiOutlineStar} from 'react-icons/ai';
export default async function ProductDetails({ params }) {
const slug = params.product;
const product = await getProduct(slug);
console.log("product",product)
return (
<div>
<div className='product-detail-container'>
<div>
<div className='image-container'>
<img src={product.image[0]} alt="product-image"
className='product-detail-image'
/>
</div>
<div className='small-images-container'>
{product.image.map((item, i) => (
<img
src={item}
alt={`product-image-${i}`}
key={i}
/>
))}
</div>
</div>
我真正想做的是一个使用状态来访问图像数组,这样当我单击它时它就会显示每个图像
const [index, setIndex] = useState();
<div className='small-images-container'>
{product.image.map((item, i) => (
<img
src={item}
alt={`product-image-${i}`}
key={i}
onMouseEnter={()=> setIndex(i)}
/>
))}
</div>
谢谢你,我希望我的问题是可以理解的
我真的不知道该怎么办,我应该把数据从理智不同?
2条答案
按热度按时间gojuced71#
在接下来的13个应用程序路由器中,您需要选择组件是服务器组件(仅在服务器上运行)还是客户端组件(在浏览器中运行)。使用诸如
useState
之类钩子的组件必须是客户端组件。另一方面,只有服务器组件可以是async
。目前你正试图同时使用这两个,所以它是无效的。因此,一种选择是将现有的
ProductDetails
组件转换为真正的客户端组件,方法是删除async
关键字并将抓取操作移到useEffect
中,以避免在每次呈现时都进行抓取(或者更好的方法是使用react-fetch或swr等抓取库)。或者,您可以使
ProductDetailsFetcher
成为获取数据的异步服务器组件,然后将product
作为prop传递给执行渲染的客户端组件。只有客户端组件具有useState
。最佳选项可能取决于
getProduct
的使用方式-即无论它是被设计为在客户端还是服务器上运行。ifmq2ha22#
尝试使用useEffect通过'@/sanity/sanity-utils'加载getProduct。