【问题标题】:Warning: Expected server HTML to contain a matching <section> in <div>. ---- Next.js / react警告:预期的服务器 HTML 在 <div> 中包含匹配的 <section>。 ---- Next.js/反应
【发布时间】:2021-08-11 14:35:10
【问题描述】:

这是我第一次使用 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);

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

感谢您的宝贵时间!

【问题讨论】:

    标签: reactjs next.js


    【解决方案1】:

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

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

      //Navbar
      const [auth,setAuth] = useState()
      useEffect(()=>{
    
        var auth = JSON.parse(localStorage.getItem("Auth"));
        setAuth(auth)
      },[])
    
    

    【讨论】:

      猜你喜欢
      • 2021-01-15
      • 2021-08-19
      • 2020-07-04
      • 2020-11-07
      • 1970-01-01
      • 2021-09-05
      • 1970-01-01
      • 2018-03-08
      • 2021-08-16
      相关资源
      最近更新 更多