reactjs next.js13使用async函数获取数据并使用state?

sd2nnvve  于 2023-06-22  发布在  React
关注(0)|答案(2)|浏览(158)

我希望你有一个伟大的日子!我有个问题...我目前正在学习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>

谢谢你,我希望我的问题是可以理解的
我真的不知道该怎么办,我应该把数据从理智不同?

gojuced7

gojuced71#

在接下来的13个应用程序路由器中,您需要选择组件是服务器组件(仅在服务器上运行)还是客户端组件(在浏览器中运行)。使用诸如useState之类钩子的组件必须是客户端组件。另一方面,只有服务器组件可以是async。目前你正试图同时使用这两个,所以它是无效的。
因此,一种选择是将现有的ProductDetails组件转换为真正的客户端组件,方法是删除async关键字并将抓取操作移到useEffect中,以避免在每次呈现时都进行抓取(或者更好的方法是使用react-fetch或swr等抓取库)。
或者,您可以使ProductDetailsFetcher成为获取数据的异步服务器组件,然后将product作为prop传递给执行渲染的客户端组件。只有客户端组件具有useState
最佳选项可能取决于getProduct的使用方式-即无论它是被设计为在客户端还是服务器上运行。

ifmq2ha2

ifmq2ha22#

尝试使用useEffect通过'@/sanity/sanity-utils'加载getProduct。

export default async function ProductDetails({ params }) {
  const slug = params.product;
  const [product, setProduct] = useState();
  useEffect(() => {
    getProduct(slug)
    .then(res => res.json())
    .then(data => setProduct(data))
    .catch(err => console.log(err));

  }, [] /* [] means it will load only once when component is mounted */)

  console.log("product",product)

  return (JSX)
}

相关问题