javascript 使用Map函数时React水合错误

x33g5p2x  于 2023-03-28  发布在  Java
关注(0)|答案(1)|浏览(132)

我一直在学习React/Next JS,我正在整理一个基本的表,该表基于来自这个公共API端点的项目数组动态填充:https://jsonplaceholder.typicode.com/todos
获取这些数据时工作正常,只是我得到了一个react-hydration-error,我相信这与我的array.map函数有关。我假设这与async-await函数和渲染组件的其余部分之间的差异有关,但我不确定如何在具有相同功能的情况下修复这个问题。
错误是:
未处理的运行时错误水合失败,因为初始UI与服务器上呈现的不匹配。
警告:服务器HTML应在中包含匹配项。
查看更多信息:https://nextjs.org/docs/messages/react-hydration-error
Component Stack table section main div Layout Home App
我的index.js代码是:

import Head from 'next/head';
import Layout, { siteTitle } from '../components/layout';
import utilStyles from '../styles/utils.module.css';
import React, { useState, useEffect } from 'react';

export async function getStaticProps(context) {

  const res = await fetch('https://jsonplaceholder.typicode.com/todos');
  const data = await res.json();

  return {
    props: {entries: data}, 
  }
}


export default function Home({entries}) {
  return (
    <Layout home>
      <Head>
        <title>{siteTitle}</title>
      </Head>
      <section className={utilStyles.headingMd}>
        <table>
          <tr>
            <th>Title</th>
            <th>Completed</th>
          </tr>
          {entries.map(entry => (
            <div key = {entry.id}>
              <tr>
                <td><a><h3>{entry.title}</h3></a></td>
                <td><a><h3>{JSON.stringify(entry.completed)}</h3></a></td>
              </tr>
            </div>
          ))};
        </table>
      </section>
    </Layout>
  );
}

我的layout.js代码很简单:

import Head from 'next/head';
import Image from 'next/image';
import styles from './layout.module.css';
import utilStyles from '../styles/utils.module.css';
import Link from 'next/link';

const name = 'Email Dashboard';
export const siteTitle = 'Email Dashboard';

export default function Layout({ children, home }) {
  return (
    <div className={styles.container}>
      <Head>
        
      </Head>
      <header className={styles.header}>
        {home ? (
          
            <h1 className={utilStyles.heading2Xl}>{name}</h1>
          
        ) : (
            <h1 className={utilStyles.heading2Xl}>{name}</h1>
        )}
      </header>
      <main>{children}</main>
      {!home && (
        <div className={styles.backToHome}>
          <Link href="/">← Back to home</Link>
        </div>
      )}
    </div>
  );
}

如果你需要任何进一步的信息,或者你能提供一个简单的解决方法,请告诉我,谢谢
我试着逐渐删除部分的列表,完全删除对列表的引用,只是在静态文本占位符中编写,我仍然会遇到水合问题。

gkn4icbw

gkn4icbw1#

尝试从标记表中删除div标记
也许你可以把它改成这样:

<section className={utilStyles.headingMd}>
    <table>
      <thead>
        <tr>
          <th>Title</th>
          <th>Completed</th>
        </tr>
      </thead>
      <tbody>
      {entries.map(entry => (
         <tr key = {entry.id}>
           <td><a><h3>{entry.title}</h3></a></td>
           <td><a><h3>{JSON.stringify(entry.completed)}</h3></a></td>
         </tr>
      ))};
      </tbody>
    </table>
</section>

相关问题