如何在Next.js 13的客户端组件中使用cookie,并在启用动态路由时在初始SSR请求时读取它们?

e1xvtsh3  于 2023-08-04  发布在  其他
关注(0)|答案(2)|浏览(111)

我真的不知道Next.js有什么计划让cookie在客户端组件中工作。current docs they have for cookies与客户端组件不兼容。
在服务器组件中,您可以使用server actions读取和设置cookie。对于客户端组件,您可以使用服务器操作来设置它们,但看起来您无法读取cookie。尝试使用cookie().get(name)会导致以下错误。
您正在导入一个需要next/header的组件。这只适用于服务器
...
组件,但其父组件之一标记为“使用客户端”,因此它是客户端组件。其中一个被标记为带有“use client”的客户端条目:
./app/client/hooks/useCookies.ts
./app/client/components/SomeComponent.tsx
当然,你可以添加一个服务器动作来读取cookie,我已经测试过,看看它的工作原理。但我拒绝用异步函数处理和不必要的服务器访问来搞乱我的代码,只是为了读取一个已经存在于浏览器中的cookie。
我也试过库,比如cookies-next,它似乎是最好的维护和Next.js cookie的工作库。这一个工作来读取和设置cookie在客户端的客户端组件。
使用该库的问题是初始渲染 Flink ,因为该库似乎无法读取具有应用程序路由的cookie服务器端。即使我使用Route Segment Config手动启用动态路由,所有cookie在初始SSR请求中也是未定义的。首先,当我到达客户端时,cookie被找到并正确读取。使用静态呈现,cookie显然无法读取。
我还尝试使用内置在cookie系统中的Next.js设置cookie,然后在我的客户端组件中使用cookies-next库阅读它们。即使使用该解决方案,在初始SSR请求中也未定义cookie。
因此,我想知道,有没有人能告诉我,在使用Next.js应用程序路由时,是否有一种方法可以使这两个条件一起工作?

  • 能够直接从浏览器读取客户端组件中的cookie(无需服务器操作)
  • 当启用动态路由时,能够在初始SSR请求中读取服务器上客户端组件中的cookie

我真的必须读取服务器组件中的cookie并将cookie值作为序列化值传递给客户端组件吗?这也意味着当我为cookie设置新值时,they will not be automatically updated
我觉得这里有一些工作非常错误,或者我希望我完全错过了一些东西。使用cookie的全部目的是您应该能够在客户端和服务器端读取它们。

lbsnaicq

lbsnaicq1#

我也试过,也有过经验:客户端cookie在客户端组件中可用,服务器cookie在服务器组件中可用。这些不同的cookie彼此无法访问。看起来这是NextJS的另一个缺陷

pgvzfuti

pgvzfuti2#

请说说你试过什么。我不知道我是否正确地理解了这个问题,但我希望这能有所帮助。

import { cookies } from 'next/headers'
 
export default function Page() {
  const cookieStore = cookies()
  const theme = cookieStore.get('theme')
  return '...'
}

字符串
请查看Next Documentatoin了解更多信息。

相关问题