这是我的网站https://atmos-app-p6hi7.ondigitalocean.app/我需要减少页眉上的填充,当用户滚动时,我做这个组件:

    import Link from 'next/link'
import Image from 'next/image'
import { GET_HEADER, getInfo } from '@/api/api'
import Submenu from './parts/Submenu'
import Burguer from './parts/Burguer'
import HeaderContainer from './parts/HeaderContainer'

export default async function Header() {
  const info = await getInfo(GET_HEADER)
  if (info === null || info === undefined) return null
  const dataHead = info.data?.header.data.attributes.links || []

  return (
    <HeaderContainer>
      <ul className='flex lg:hidden justify-between px-4 items-center'>
        <Link href='/'>
          {' '}
          <Image
            src='/images/logo.svg'
            width='140'
            height='140'
            alt='LogoHeader'
          />{' '}
        </Link>
        <Burguer dropdown={dataHead} />
      </ul>
      <ul className='hidden lg:flex justify-around items-center px-6'>
        {dataHead.map((link, i) => {
          const { title, href, index, dropdown, external_link } = link

          if (index) {
            return (
              <Link key={i} href={href}>
                {' '}
                <Image
                  src='/images/logo.svg'
                  width={150}
                  height={150}
                  alt='LogoHeader'
                />{' '}
              </Link>
            )
          }

          if (dropdown.length > 0) {
            return <Submenu key={i} title={title} dropdown={dropdown} />
          }

          return (
            <Link
              key={i}
              href={href ? href : ''}
              className='text-white hover:text-gray-300 transition duration-300'
              target={external_link ? '_blank' : '_self'}
            >
              {title}
            </Link>
          )
        })}
      </ul>
    </HeaderContainer>
  )
} 

在HeaderContainer上,我使用了一些react 挂钩,如下所示:

'use client'
import { useState, useEffect } from 'react'

const HeaderContainer = ({ children }) => {
  const [scrolled, setScrolled] = useState(false)
  console.log(window.scrollY)

  useEffect(() => {
    const handleScroll = () => {
      if (window.scrollY > 50) {
        setScrolled(true)
      } else {
        setScrolled(false)
      }
    }

    window.addEventListener('scroll', handleScroll)

    return () => {
      window.removeEventListener('scroll', handleScroll)
    }
  }, [])

  return (
    <header
      className={`${
        scrolled ? 'py-10 lg:py-8' : 'py-16 lg:py-14'
      } fixed top-[-0.25rem] lg:top-0 lg:ml-[-1rem] bg-[url(/images/menu_desktop.svg)] bg-no-repeat text-xl bg-cover bg-center w-screen lg:w-[105%] z-[500]`}
    >
      <nav className='container mx-auto'>{children}</nav>
    </header>
  )
}

export default HeaderContainer

但它给出了以下错误:"未处理的运行时错误 错误:客户端组件上尚不支持异步/等待,仅服务器组件上支持.此错误通常是由于在最初为服务器编写的模块中意外添加了"Use Client"而导致的.

我不知道为什么,当我需要使用服务器端时,我只在子元素身上使用客户端,而不是在父母身上.有人知道如何实现我的目标吗?

推荐答案

您遇到的错误"客户端组件还不支持异步/等待",这是因为您在客户端组件中使用了一个异步函数(async function Header()).在Next.js中,客户端组件默认不支持像await这样的异步操作.

为了实现在用户滚动时减少标题填充的目标,您应该在服务器端或在服务器端呈现(SSR)期间获取所需的数据,并将其作为props 传递给组件.

以下是如何重构代码的高级概述:

  1. 将数据获取逻辑移动到单独的函数,最好是在服务器端文件中(例如,页面文件中的getServerSideProps函数).

  2. 将获取的数据作为props 传递给您的Header组件.

  3. 修改您的Header组件以将数据作为props 接收,并使用它呈现标题.

下面是一个简化的例子:

// In your page file (e.g., pages/index.js)
import Header from '../components/Header';

// Implement getServerSideProps to fetch data on the server side.
export async function getServerSideProps() {
  const info = await getInfo(GET_HEADER);
  const dataHead = info?.data?.header.data.attributes.links || [];

  return {
    props: {
      dataHead,
    },
  };
}

// Pass the fetched data as a prop to the Header component.
export default function Home({ dataHead }) {
  return (
    <div>
      <Header dataHead={dataHead} />
      {/* Rest of your page content */}
    </div>
  );
}

在你的Header个成分股中:

import Link from 'next/link';
import Image from 'next/image';
import Submenu from './parts/Submenu';
import Burguer from './parts/Burguer';
import HeaderContainer from './parts/HeaderContainer';

export default function Header({ dataHead }) {
  // Your component logic remains the same, but use dataHead instead of fetching it.

  return (
    <HeaderContainer>
      {/* Render your header using dataHead */}
    </HeaderContainer>
  );
}

通过遵循此模式,您可以确保数据获取发生在服务器端,并将获取的数据作为props 传递给客户端组件,从而避免遇到的错误.

Reactjs相关问答推荐

react 派生状态未正确更新

react 路由导航不工作,但手动路由工作

如何通过浏览器路由在单独的.jsx文件中使用MUI抽屉?

在Reaction中更新状态时,我将变得未定义

使用REACT-RUTER-V6和ZUSTANDreact 中的身份验证

如何从Reaction-Arborist树获取排序数据

Mantine DatePickerInput呈现错误

如何将 DocuSign 控制台界面嵌入到 React 应用中

React Js和Firestore中如何将当前ID与集合中的ID查询以仅显示具有相似字段和值的文档-第二部分

如何让 useEffect 在 React.JS 中只运行一次?

Firebase Storage: 对象不存在图片上传路径错误

如何使用 redux 和 react-plotly.js

如何在同一路由路径上重新渲染组件(链接,V6)reactjs

使用 React.lazy 调试 webpack 代码拆分

Reactjs 表单未反映提交时的更改

使用 react-router-dom 时弹出空白页面

为什么我在此代码段中看不到 useEffect for count = 1?

为什么我不能使用 formik 更改此嵌套对象中的值

下拉菜单在 AppBar 中未正确对齐

React 似乎在触发另一个组件时重新渲染了错误的组件