Maison  >  Questions et réponses  >  le corps du texte

Comment corriger les erreurs de React Hydration causées par l'utilisation du rendu côté client dans React et Next.js ?

Intégré au hook useEffect dans React. Mon objectif est d'incorporer le rendu côté client tout en garantissant que les erreurs d'hydratation de réaction sont évitées.

Si je comprends bien, le rendu côté client nécessite que les composants soient rendus sur le navigateur client plutôt que sur le serveur, améliorant ainsi les performances et l'interactivité. Cependant, lors de la transition vers le rendu côté client, des problèmes peuvent survenir en raison d'incohérences entre le code HTML initial rendu côté serveur et les composants ultérieurs rendus côté client, entraînant des erreurs React-Hydration-Errors.

En gardant cette situation à l'esprit, j'apprécierais vraiment vos conseils sur l'utilisation efficace des hooks useEffect pour obtenir un rendu correct côté client sans rencontrer d'erreurs de réaction-hydratation. Je recherche une approche professionnelle pour relever ce défi et j'apprécierais vraiment toutes les meilleures pratiques, stratégies ou exemples de code que vous pourriez partager.

Merci d'avance pour votre aide précieuse.

Voici mon exemple de code :

https://nextjs.org/docs/messages/react-Hydration-error

"use client"
import Image from 'next/image';
import Link from 'next/link';
import React, { useState, useEffect } from 'react';
import { AiOutlineClose, AiOutlineMenu } from 'react-icons/ai';
import { motion, useScroll } from 'framer-motion';
import logo from '../public/logo_navbar_adobe_express.svg';
import { variants } from '../utils/motion';
import { BsArrowRightCircle } from 'react-icons/bs'
import styles from '../styles';

function useWindowSize(nav, setNav) {
  const [windowSize, setWindowSize] = useState([0, 0]);

  useEffect(() => {
    function updateWindowSize() {
      setWindowSize([window.innerWidth, window.innerHeight]);
      if (window.innerWidth >= 768 && nav) {
        setNav(false);
      }
    }

    window.addEventListener('resize', updateWindowSize);
    updateWindowSize();

    return () => window.removeEventListener('resize', updateWindowSize);
  }, [nav, setNav]);

  return windowSize;
}

const Navbar = () => {
  const [nav, setNav] = useState(false);
  const windowSize = useWindowSize(nav, setNav);
  const isMobile = windowSize[0] < 768;
  const handleNav = () => {
    setNav(!nav);
  };

  /** this hook gets the scroll y-axis **/
  const { scrollY } = useScroll();
  /** this hook manages state **/
  const [hidden, setHidden] = React.useState(false);

  /** this onUpdate function will be called in the `scrollY.onChange` callback **/
  function update() {
    if (scrollY?.current < scrollY?.prev) {
      setHidden(false);
    } else if (scrollY?.current > 100 && scrollY?.current > scrollY?.prev) {
      setHidden(true);
    }
  }

  /** update the onChange callback to call for `update()` **/
  useEffect(() => {
    return scrollY.onChange(() => update());
  }, [scrollY]); // Add scrollY as a dependency


  return (
    <motion.nav
    
      variants={variants}
      initial="hidden"
      animate={hidden ? 'hidden' : 'visible'}
      /** I'm also going to add a custom easing curve and duration for the animation **/
      transition={{ ease: [0.1, 0.25, 0.3, 1], duration: 0.6 }}
      className={`navbar-bg dark:bg-gray-900 fixed w-full z-20 top-0 left-0`}
    >
      <div className="absolute w-[20%] inset-0 gradient-01" />
      <div className="max-w-screen-xl flex flex-wrap items-center justify-between mx-auto p-4">
        <Link href="/">
          <Image
            src={logo}
            alt="/"
            className="cursor-pointer"
            width="175"
            height="175"
          />
        </Link>

La fonction useWindowSize semble déclencher une erreur d'hydratation de réaction

P粉144705065P粉144705065224 Il y a quelques jours440

répondre à tous(1)je répondrai

  • P粉639667504

    P粉6396675042024-04-01 00:27:05

    Évidemment, pour résoudre ce problème, je viens de courir npm install next@latest

    répondre
    0
  • Annulerrépondre