Next.js中的React水合错误-“Expected server HTML to contain a matching < a>in< a>“

wecizke3  于 2023-08-04  发布在  React
关注(0)|答案(1)|浏览(188)

我正在做一个Next.js项目,我一直遇到一个水合错误。我看到的具体错误消息是:
错误:由于初始UI与服务器上呈现的UI不匹配,因此水合失败。
警告:服务器HTML应在中包含匹配项。
我理解这可能是由于服务器端渲染(SSR)HTML和React在客户端生成的HTML之间的不匹配造成的。此警告表明,服务器呈现的HTML中应该有标记,但未找到。

import React from 'react';
import styled from 'styled-components';
import {
  FaIcon1 as Icon1,
  FaIcon2 as Icon2,
  FaIcon3 as Icon3,
  FaIcon4 as Icon4
} from 'react-icons/fa';
import Link from 'next/link';

const Container = styled.div`
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  height: 100vh;
  background: #ffffff;
`;

const ListItemContainer = styled.div`
  display: flex;
  flex-direction: column;
  align-items: center;
  justify-content: space-between;
  width: 70%;
  overflow-y: auto;

  @media (min-width: 768px) {
    flex-direction: row;
  }
`;

const ListItem = styled.div`
  display: flex;
  flex-direction: column;
  justify-content: center;
  align-items: center;
  padding: 10px;
  margin: 10px 10px;
  font-size: 1.8em;
  border: 1px solid #299d51;
  border-radius: 5px;
  cursor: pointer;
  color: #14080e;
  transition: background 0.3s;
  width: 50vw;
  min-height: 20vh;
  text-align: center;

  &:hover {
    background: #4cb16b;
  }

  @media (min-width: 768px) {
    width: 20vw;
  }

  svg {
    color: #00722e;
    margin-bottom: 20px;
  }
`;

const Home: React.FC = () => {
  return (
    <Container>
      <ListItemContainer>
        <Link href="/route1">
          <ListItem>
            <Icon1 size={70} />
            Item 1
          </ListItem>
        </Link>
        <ListItem>
          <Icon2 size={70} /> Item 2
        </ListItem>
        <ListItem>
          <Icon3 size={70} /> Item 3
        </ListItem>
        <ListItem>
          <Icon4 size={70} /> Item 4
        </ListItem>
      </ListItemContainer>
    </Container>
  );
};

export default Home;

字符串
如何在NextJS 13中修复此错误?

a0zr77ik

a0zr77ik1#

该问题是由Next.js中的组件引起的。我通过将组件替换为标准标记来修复它:

<a href="/stock">
  <ListItem>
    <Icon1 size={70} />
    Item 1
  </ListItem>
</a>

字符串
这将在单击链接时强制刷新整个页面,这与启用客户端导航的组件不同。请注意,这是一种解决方法,可能会因页面重新加载而影响性能。

相关问题