我是NextJS的新手,所以这个问题听起来可能很琐碎,所以请原谅我。所以,基本上我想从数据库中获取数据,并在第一次渲染时将其显示在页面中,为此,我尝试使用useEffect和useState钩子,如下所示。
"use client"
import axios from "axios"
import Link from "next/link"
import { useEffect } from "react"
async function ProductsComponent( ) {
const [products,setProducts] = useState<any[]>([])
useEffect(()=>{
async function fetchProducts() {
"use server"
try {
const productsresponse = await axios.get(`${process.env.BASE_URL}/api/productControllers`)
if(productsresponse.status === 200){
setProducts(productsresponse.data.message)
}else{
console.log("Failed to fetch Products")
}
} catch (error) {
}
}
fetchProducts()
},[])
return (
<div className=" flex flex-col">
<h3>Product Name</h3>
{
products?.map(product=>(
<div>
<h4>{product?.productName}</h4>
</div>
</div>
))
}
</div>
)
}
export default ProductsComponent
字符串
但我得到一个错误:
客户端组件暂不支持aprc/await,仅支持服务器组件。
如果我删除"use client"
,我会得到一个错误:
您正在导入一个需要useState的组件,它只在客户端组件中工作,但它的父组件都没有使用“use client”标记,因此默认为服务器组件。
那么我如何从数据库中获取数据并在NextJS >=13中呈现它呢?
我试着定义一个单独的服务器端函数组件,它使用useEffect从数据库中获取数据,该组件将product和setproduct作为props,我将该组件传递到另一个客户端组件中,在那里我们定义了像product,setProduct这样的状态,但我仍然得到一个错误。
2条答案
按热度按时间dfty9e191#
页面呈现方式有两种:
两种解决方案:
'use client'
组件并将其导入页面。*服务器组件https://nextjs.org/docs/app/building-your-application/rendering/server-components
*在Next.js中使用服务器组件https:nextjs.org/docs/app/building-your-application/rendering/server-components#using-server-components-in-nextjs
*客户端渲染的好处https:nextjs.org/docs/app/building-your-application/rendering/client-components#benefits-of-client-rendering
***何时使用“使用客户端”**https:react.dev/reference/react/use-client#when-to-use-use-client
*客户端组件https://nextjs.org/docs/app/building-your-application/rendering/client-components
*在Next.js中使用客户端组件https:nextjs.org/docs/app/building-your-application/rendering/client-components#using-client-components-in-nextjs
*渲染:https://nextjs.org/docs/app/building-your-application/rendering
*服务器和客户端组成模式https://nextjs.org/docs/app/building-your-application/rendering/composition-patterns
如你所说
在第一次呈现时将其显示在页面中
**所以SSR将是要走的路,因为它将生成页面并将其发送到客户端。**没有加载状态,将被视为。
我使用的是NextJS版本:
13.5.4
默认情况下,Next.js将组件视为服务器组件。但是当您在组件中使用
use client
时,您将其视为客户端组件。https://nextjs.org/docs/app/building-your-application/rendering/server-components#using-server-components-in-nextjs
因此,当你从使用(useEffect,useState等)的组件中删除
'use client'
时,它会抛出一个错误,因为这是在客户端进行水合/计算的。您正在导入一个需要useState的组件。它只在客户端组件中工作,但它的父组件都没有标记为“use client”,因此它们默认为服务器组件。
这是两个实现的代码。
文件夹结构:
字符串
*服务端渲染
loc\src\app\products\page.js
个型
说明:
输出:
http://localhost:3000/products
路线行驶-----------------------------------------------------------------------------
客户端渲染:
产品列表组件
loc\src\app\comp\ProductsList.js
型
现在创建一个页面
loc\src\app\products_clientside\page.js
& import ProductsList型
说明:
Getting Products ....
,当它获取数据集时显示。输出:
http://localhost:3000/products_clientside
"Getting Products ...."
,并且在控制台中还显示从API接收的数据products_clientside
,单击它,然后在右侧单击Preview Tab
,您将看到页面呈现,直到pvabu6sv2#
请尝试将
'use server'
从'use server'
函数中删除,因为客户端组件中不允许使用“use server”函数。您可以创建一个“use server”文件,然后从“use server”文件导入它们。更新代码:
字符串
简单地删除'使用服务器'为我工作,希望它也将为您工作。