首页 > 解决方案 > 警告:预期的服务器 HTML 包含匹配项

. ---- Next.js/反应

问题描述

这是我第一次使用 next.js,我遇到了一些问题......

所以我只是正常做我的应用程序,我查看了开发工具,有这个问题

在此处输入图像描述

现在,我的第一个想法是,好吧,我没有关闭 html 标签,我查看了我的 Navbar 和 AuthContext 组件,这不是问题,所以,我真的不知道发生了什么,我希望你能帮助我。

让我告诉你组件

导航栏

import { NavbarHeader } from "./NavbarStyled";
import Part1 from "./Parts/Part1";
import Part2 from "./Parts/Part2";
import Part3 from "./Parts/Part3";

const Navbar = () => {
  if (typeof window !== "undefined") {
    var auth = JSON.parse(localStorage.getItem("Auth"));
  }
  return (
    <>
      {auth ? (
        <NavbarHeader>
          {/* Go home icon - search bar */}
          <Part1 />
          {/* Middle Icons */}
          <Part2 />
          {/* User information */}
          <Part3 />
        </NavbarHeader>
      ) : (
        <div></div>
      )}
    </>
  );
};

export default Navbar;

这是 AuthContext

import { createContext } from "react";

import {
  Actions,
  dataObject,
  LOGIN,
  LOGOUT,
  LOGINLOADING,
  LOGINNOLOADING,
  REGISTERLOADING,
  REGISTERNOLOADING
} from "../GlobalInterfaces/AuthContextInterfaces";
import { useReducer } from "react";
import { useContext } from "react";

interface Istate {
  loginLoading: boolean;
  registerLoading: boolean;
  data?: dataObject | null;
}

const DefaultState = createContext<Istate>({
  loginLoading: false,
  registerLoading: false
});

const DispatchActions = createContext(null);

const localReducer = (state: Istate, action: Actions): Istate => {
  switch (action.type) {
    case LOGINLOADING:
      return {
        ...state,
        loginLoading: true
      };

    case LOGINNOLOADING:
      return {
        ...state,
        loginLoading: false
      };

    case REGISTERLOADING:
      return {
        ...state,
        registerLoading: true
      };

    case REGISTERNOLOADING:
      return {
        ...state,
        registerLoading: false
      };

    case LOGIN:
      localStorage.setItem("Auth", JSON.stringify({ ...action.payload }));
      return {
        ...state,
        loginLoading: false,
        registerLoading: false,
        data: action.payload
      };

    case LOGOUT:
      localStorage.removeItem("Auth");
      return {
        ...state,
        data: null
      };

    default:
      return state;
  }
};

export const AuthContext = ({ children }: { children: React.ReactNode }) => {
  const [state, dispatch] = useReducer(localReducer, {
    registerLoading: false,
    loginLoading: false,
    data: null
  });

  return (
    <DefaultState.Provider value={state}>
      <DispatchActions.Provider value={dispatch}>
        {children}
      </DispatchActions.Provider>
    </DefaultState.Provider>
  );
};

export const AuthData = () => useContext(DefaultState);
export const AuthActions = () => useContext(DispatchActions);

这个问题是什么意思,可能是什么原因造成的?

谢谢你的时间 !

标签: reactjsnext.js

解决方案


您的服务器和浏览器呈现的 html 输出不匹配。我相信罪魁祸首是你的Navbar组件,html在服务器上生成的只是一个空的 div,而在浏览器中它将是<NavBarHeader>内容。

auth只需要在浏览器中运行逻辑,在 Next.js 中执行的方式是使用useEffect.

  //Navbar
  const [auth,setAuth] = useState()
  useEffect(()=>{

    var auth = JSON.parse(localStorage.getItem("Auth"));
    setAuth(auth)
  },[])


推荐阅读